SQL-eksempel 08
|
<< Click to Display Table of Contents >> SQL-eksempel 08 |
![]() ![]()
|
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