SQL aggregationer

<< Click to Display Table of Contents >>

Navigation:  NeoBase-opgørelser & replikat database >

SQL aggregationer

Previous pageReturn to chapter overviewNext page

Aggregationer: sammentællinger / kolonnestatistik

En af de opgaver indenfor SQL-forepørgsler, hvor man skal "holde tungen lige i munden" er ved aggregationer i forbindelse med forespørgsler, hvor der samtidigt ønskes optælling/statistik på kun distinkte værdier.

I standard SQL forefindes funktionsprædikatet DISTINCT, der foruden med SELECT kan anvendes sammen med de forskellige SQL aggregationsfunktioner, hvor det dog kun har mening for nogle af dem, men en del databaser, heriblandt Absolute Database, har ikke dette prædikat implementeret overfor aggregationer. Funktionen ville ellers i givet fald i standard SQL kunne udføres som i udtrykket:
 SELECT feltnavn1, COUNT(DISTINCT feltnavn2) AS Antal FROM KildeTabel GROUP BY feltnavn1;
(N.B.: Prædikatet DISTINCT knyttet til aggregatfunktioner som f.eks. COUNT, SUM, AVG må ikke forveksles med funktionen af prædikatet DISTINCT knyttet til SELECT.)
Eksempel:
Navn  Indlagt  
Anna  03.04.2005
Beate 16.03.2005
Beate 02.04.2005 (genindlæggelse)
Carla 11.05.2005
hvor man udfra en liste over indlæggelser (4) ønsker at udtrække antallet af indlagte patienter (dvs. distinkte værdier = individer).
Ved SELECT DISTINCT Navn vises kun tre rækker med de tre distinkte navne men udtrækket giver ikke den ønskede sammentælling. Ved aggregation (sammentælling) vil man med SELECT COUNT(Navn) AS Antal få tallet 4 hvorimod SELECT COUNT(DISTINCT Navn) AS Antal kun tæller på distinkte værdier og dermed kun og som ønsket giver tallet 3.

Distinkte optællinger via sub-queries

Alternativt til (den ikke understøttede) COUNT(DISTINCT feltnavn) kan man anvende en sub-query med formen:
 SELECT COUNT(tbl.feltnavn1) AS Antal FROM (SELECT DISTINCT tbl.feltnavn1 FROM tabel tbl);
hvor de distinkte værdier indkredses i sub-query'en ved at man hér har udnyttet DISTINCT prædikatet i forhold SELECT funktionen.

IN MEMORY tabeller

For overskuelighedens skyld kan det fremfor anvendelsen af sub-queries være nemmere at udføre sådanne optællinger på distinkte værdier ved at køre to (eller flere) successive forespørgsler med temporære lagringer af de udtrukne mellemresultater. Absolute Database kan ligesom flere andre databaser, fremfor mellemlagringer på harddisken, med en tydelig hastighedsgevinst lagre disse mellemresultater som virtuelle tabeller i computerens hukommelse, hvor der foran det valgfrie temporære tabelnavn sættes prædikatet MEMORY. Et eksempel på sådanne successive forespørgsler kan være som følger:

 SELECT DISTINCT feltnavn1 INTO MEMORY Temp FROM KildeTabel;
 SELECT COUNT(feltnavn1) AS "Antal" FROM MEMORY Temp;

Specielt, hvis der arbejdes med genererede feltværdier og feltnavne via CASE funktionen, kan det være nødvendigt med den viste opdeling i selvstændige men successivt og samlet afviklede SQL-udtryk. Det viste temporære tabelnavn Temp skal være ens for de to korresponderende forspørgsler men er iøvrigt arbitrært.
Se også SQL MEMORY mellemlagringer.

_____________________________

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