SQL-eksempel 08

<< Click to Display Table of Contents >>

Navigation:  NeoBase SQL-eksempler >

SQL-eksempel 08

Previous pageReturn to chapter overviewNext page

Børn udskrevet i live år xx

For baggrund - se NeoBase opgørelser - definitioner og konventioner.

==================================================================================
/* Viser antal børn udskrevet i live fra valgte årgang baseret på udskrivelsesdato
og fordelt på GA grupper. N.B. Tæller individer, ikke udskrivelser! */

 

SELECT

CASE

 WHEN np."GA hele uger" < 28 THEN '0: GA < 28'

 WHEN np."GA hele uger" >= 28 AND np."GA hele uger" < 32 THEN '1: GA 28-31'

 WHEN np."GA hele uger" >= 32 AND np."GA hele uger" < 37 THEN '2: GA 32-36'

 WHEN np."GA hele uger" >= 37 AND np."GA hele uger" < 99 THEN '3: GA >= 37'

 WHEN np."GA hele uger" = 99 THEN '4: GA ukendt'

END AS "GA gruppe",

np.PersonId

INTO MEMORY Temp

FROM NeoPers np;

--------------------------------------------------------------------------

SELECT

mt."GA gruppe", COUNT(n2.PersonId) AS "Børn udksr i live 2004"

FROM

(SELECT DISTINCT mt."GA gruppe", n2.PersonId

FROM MEMORY Temp mt

  JOIN NeoBase2 n2 ON (n2.PersonId = mt.PersonId)

 WHERE

  EXTRACT(YEAR FROM n2.Udskrivelsesdato) = '2004'

  AND

   (n2.PersonId NOT IN

    (SELECT n22.PersonId FROM NeoBase2 n22 WHERE n22."Tilstand ved udskrivelsen" = '3')

  )

)

GROUP BY

[GA gruppe]

UNION

SELECT [GA gruppe], COUNT(n2.PersonId)

FROM

(SELECT DISTINCT '5: Sum' AS "GA gruppe", n2.PersonId

 FROM Neobase2 n2

 WHERE

  EXTRACT(YEAR FROM n2.Udskrivelsesdato) = '2004'

  AND

   (n2.PersonId NOT IN

    (SELECT n22.PersonId FROM NeoBase2 n22 WHERE n22."Tilstand ved udskrivelsen" = '3')

   )

)

GROUP BY

[GA gruppe]

ORDER BY

[GA gruppe];

==================================================================================

SQL-eksemplet

Specifikke målsætning: opgørelse af antal børn udskrevet i live set som samlet udfald af evt. successive indlæggelser indenfor den givne årgang og grupperet på gestationsaldre som grupper, der ikke nødvendigvis eksplicit forefindes som inddeling i databasen (der kun grupperer på de enkelte hele GA-uger).

Ovenstående eksempel illustrerer på samme tid flere interessante problemstillinger og -løsninger:

Sucessive SQL-udtryk og temporære in-MEMORY tabeller:
Øverste SQL-udtryk (afsluttet med det første semikolon) anvendes til at generere et ad hoc felt 'GA gruppe' (defineret ved alias via: AS [GA gruppe]) med værdier ('0: GA < 28', etc.) svarende til de ønskede opgjorte gestationsalder-intervaller, der ikke i forvejen ligger defineret i databasen, og som patienterne allokeres til udfra deres specifikke gestationsalder.
Ved efterfølgende at anvende resultatet af denne forespørgsel, der lagres i den virtuelle Memory-tabel "Temp" (navnet Temp er arbitrært men valgt udfra tabellens temporære karaktér), som kilde for den næste forespørgsel, kan man opnå at gruppere output på værdierne fra dette hidtil ikke eksisterende data-felt [GA gruppe].

Resultat-sammenfletning med UNION:
De følgende to SQL-udtryk er koblet sammen med prædikatet UNION, der lægger resultatet af det sidste SQL-udtryk i halen af det næstsidste til een samlet udlæsning.

Indlejrede SQL-udtryk (sub-queries):
Hvert af disse to sidste (sammenkoblede) SQL-udtryk har dels brug for at hvert barn kun tælles med een gang, selvom de har været indlagt og udskrevet flere gange i samme år, hvilket opnås ved at man via den yderste sub-query (markeret med rødt) kun medtager unikke forekomster (SELECT DISTINCT) af hver PersonId udskrevet pågældende år (WHERE EXTRACT(YEAR FROM ....) = 2004), samtidigt med at børn slet ikke tælles, hvis de er døde det pågældende år samtidigt med at barnet tidligere samme år har været udskrevet i live, hvilket opnås ved relation (WHERE ... NOT IN) til betingelsen sat i den inderste sub-query (markeret med blåt). Endeligt bruges resultatet af de to dobbelt indlejrede sub-queries, der iht. ovennævnte kun indeholder distinkte forekomster af hver PersonId, som kilde (den yderste SQL-forespørgsels FROM prædikat) for den endelige optælling via funktioen COUNT, der igen grupperes indenfor de ad hoc genererede GA intervaller ([GA gruppe]) med GROUP BY.

Da den sidste SQL-forespørgsel kun udlæser een række, nemlig summen for alle GA intervaller, defineres der hér i sub-query'en en konstant ('5: Sum'), der allokeres til ad hoc feltet [GA gruppe], hvor de distinkte forekomster af PersonId udlæses i nabofeltet PersonId, der, som ovenfor, endeligt sammentælles i den yderste SQL-forespørgsel.

Afgrænsning af navne for felter, afledte/ad hoc genererede felter, ad hoc værdier og konstanter:
Kilde feltet 'GA hele uger' er som det ses afgrænset med enkelte anførselstegn, hviket er tilladt (og ISO anbefalet), men forudsætter at være præfikset med en tabelreference (hér tabel alias'et) for ikke at blive tolket som en konstant.

Alle felter, der senere i et SQL-udtryk skal behandles som et felt under f.eks. GROUP BY eller ORDER BY, og som ikke er præfikset med en tabelreference (f.eks. fordi det er et afledt eller ad hoc genereret felt), skal afgrænses med kantede parenteser for ikke at blive forvekslet med en (på dét sted illegal) konstant eller et ikke forekommende felt - jfr. det ad hoc afledte felt [GA gruppe] i det sidste SQL-udtryk. Læg mærke til forskellen i hvordan det næstsidste og det sidste SQL-udtryk refererer feltet GA gruppe, hvor det næstsidste refererer til et reelt felt mt.[GA gruppe] (ganske vist fra den vituelle temporære tabel Temp), hvor det sidste SQL-udtryk refererer til det ad hoc genererede felt [GA gruppe]. Vær endvidere opmærksom på, at selvom [GA gruppe] i det øverste SQL-udtryk er et afledt feltnavn, som ikke accepterer tabel-præfiks, så accepteres feltet refereret med præfiks i det midterste SQL-udtryk, idet det nu hentes som reelt tabelfelt fra den temporære tabel "Temp".

De ad hoc definerede GA intervaller er at betragte som konstanter, hvorfor de er afgrænset med enkelte anførselstegn og uden tabelreference.

Værdien '5: Sum' i det sidste SQL-udtryk er en konstantværdi for det ad hoc genererede felt [GA gruppe] og derfor som konstant afgrænset med enkelte anførselstegn.

Afgrænsning af kategori af børn relateret til årgang:
Se de to eksempler for n-CPAP børn: SQL-eksempel - CPAP-børn (a) og SQL-eksempel - CPAP-børn (b)

_____________________________

27-10-2017 - © 2003-2017 Niels Knabe