rozdělení sloupce v SQL tabulce   zodpovězená otázka

ADO.NET, WinForms, Databáze

Dobrý den, jako naprostý začátečník bych se chtěl zeptat ( s tradiční omluvou za případnou „hloupost“ dotazu) na následující(týká se SQL databáze a VB.Net 2005):

Mám pracovat s již dříve navrženou sql databází, kde v jedné tabulce jsou shromážděny laboratorní hodnoty za poslední roky. Důležité sloupce tabulky jsou ID_pacienta, datum vyšetření , ID_laboratorní položky a výsledek. Problém je v tom, že jednotlivé laboratorní položky jsou pomíchány v jednom sloupci ( například draslík, sodík, vápník) tak jak byly postupně stanoveny. Já bych pro přehledné hodnocení potřeboval zobrazit pro jednotlivé pacienty tabulku, kde v prvním sloupci by bylo datum , v dalším sloupci k příslušnému datumu sodík, v dalším sloupci draslík atd… Řešil jsem to tak, že jsem pomocí OleDbCommad vybral první laboratorní položku (např. sodík) , tu jsem pak pomocí OleDbDataReaderu cyklem naplnil do příslušné kolekce subitems(1) v ListView, pak druhým sqlCommad vybral druhou laboratorní položku(např.draslík) a naplnit do subitems(2) atd. Funguje to, ale zdá se mi to příliš těžkopádné, zvl. při více položkách a větším rozsahu. Neměl by někdo lepší nápad, jak rozdělit jeden sloupec SQL tabulky do více sloupců ListView podle určených kriterií. Díky za odpověď . Petr Knetl

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já osobně bych vyexportoval celou tabulku do nějakého txt souboru. Pomocí kódu upravil tak, aby každá položka, kterou chci aby byla v samostatném sloupci, byla oddělena nějakým oddělovačem(např.čárkou). Pak vytvořit novou tabulku s požadovanými sloupci a ten txt soubor naimportoval do tabulky prostřednictvím OSQL nebo přímo použít SQL příkaz "bulk insert".

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za odpověď, export přes text mě nanapadl (moc s ním zatím neumín). zkusím si něco vyexportovat a podívat se co by s tím šlo. "Bulk insert" jsem neznal, taktéž se na něj podívám...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Můžete dát konkrétní příklad formátu, jak máte v databázi ty laboratorní položky zadány? Je to jednotné, je to nějak oddělené, je to něčím uvozené?... Bez znalosti konkrétního formátu Vám asi nikdo moc neporadí.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky, za odpověď, rád upřesním, byl jsem možná moc stručný v obavě aby to nebylo moc dlouhé.

K tabulce mám přístup přes Access 2002, sloupce v tabulce, které mě zajímají jsou

ID_pacienta (číslo)

Datum_vyšetření (datum)

Kod_vyšetření(číslo)

Výsledek (číslo)

Jednotlivá vyšetření jsou přidána do nového řádku s datumen ak´dem pacienta. Při odběru krve v jeden den nemusí být provedena všecha z nich.

Tabulka pak vypadá následovně:

ID_pacienta Datum_vyš Kod_vyš Výsledek

..00076 07.12.07 40 (=vápník) 2,8

..00076 07.12.07 60 (=fosfor) 1,8

..00123 08.12.07 80 (=sodík) 123

..00076 14.12.07 40 (=vápník) 2,3

atd...

Já pro hodnocení nových výsledků potřebuji od vybraného pacienta

srovnat jednat vývoj jednoho vyšetření za určitou dobu (třeba poslední rok) a zároveň související vyšetření mezi sebou.

tj hodí se mi tabulka s výsledky od určitého pacienta v podobě:

Datum_vyš Výsledek(vápník) Výsledek (fosfor) Výsledek(sodík)

07.12.08 2,8 1,8 null

14.12.08 null null 123

atd..

Řešil jsem to tak, že jsem přes OleDbCommand SELECTEM vybral všschny datumy vyšetření u daného pacienta a pomocí DataReaderu je naplnil do ListView, poté dalším SELECTEM vybral

výsledky pro vápník a naplnil je do subitem(1) při kontrole správnosti datumu atd...

Funguje to, ale při více vybraných položkách je to kostrbaté.

Protože to samé v různých obměnách potřebuji ve více případech,

chtěl jsem se zeptat, zda neexistuje elgantnější řešení, které je mimo mé obzory (např. nějaký složený sql příkaz,který by sloupec rozdělil podle položek, či nějakéjednodušší načítání nebo tak něco...) Díky za Váš čas a přeji mnoho úspěchů nejen na poli VB.NET

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Uf!

Anžto nejsem bohužel v práci s SQL zběhlým a to málo, co jsem o něm věděl, když jsem to potřeboval, jsem již pozapomněl, tak přesnou vědeckou metodou "pokus-omyl" se mi podařilo složit něco následujícího:

SELECT     [table].datum, table_1.vysledek AS vapnik, table_2.vysledek AS fosfor, table_3.vysledek AS sodik
FROM         [table] LEFT OUTER JOIN
                      [table] AS table_1 ON [table].ID_pacienta = table_1.ID_pacienta AND [table].datum = table_1.datum AND table_1.kod = 40 LEFT OUTER JOIN
                      [table] AS table_2 ON [table].ID_pacienta = table_2.ID_pacienta AND [table].datum = table_2.datum AND table_2.kod = 60 LEFT OUTER JOIN
                      [table] AS table_3 ON [table].ID_pacienta = table_3.ID_pacienta AND [table].datum = table_3.datum AND table_3.kod = 80
WHERE     ([table].ID_pacienta = 76)
GROUP BY [table].datum, table_1.vysledek, table_2.vysledek, table_3.vysledek

no a když toto pustím na Vámi předvedenou databázi, dostanu (pro pacienta č. 76) výstup:

datum | vapnik | fosfor | sodik

7.12.2007 2,8 1,8 NULL

14.12.2007 2,3 NULL NULL

, což se, řekl bych, dost podobá Vašemu požadavku.

Určitě ten dotaz není moc optimalizovaný, ale snad Vám to pro odpíchnutí se bude stačit - doporučuji nastudovat alespoň základy jazyka SQL a určitě najdete i nějaké lepší řešení.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Díky moc, myslím, že jste přesně kápl na to, co jsem měl na mysli, tj. jak dostat unicitní položky z jednoho sloupce tabulky

do názvů sloupců SELECTU a jim příslušející hodnoty z dalšího sloupce původní tabulky naplnit do příslušných sloupců v SELECTU. Hned jak v týdnu budu mít chvilku, tak to zkusím rozepsat a dám vědět. Pokud to bude fungovat, tak to bude geniálně jednoduché. Ještě jednou díky, pomohl jste mi nejen s řešením problému, ale otevřel i nový prostor v SQL.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback