MainframeSupports
tip uge 5/2020:

Jeg skrev med begejstring om SQL ROLLUP tilbage i 2015. Desværre er der en detalje, der har kølnet min begejstring en hel del. Så snart jeg skal lave en GROUP BY over flere kolonner, så får jeg også del-totaler pr. ekstra kolonne, jeg tilføjer, men jeg er typisk kun interesseret i de endelige totaler.

Heldigvis er der i GROUP BY indbygget en generel metode til at lave alle mulige former for summer, del-totaler og totaler kaldet GROUPING SETS. Grouping sets giver dig fuld frihed til at aggrere dine data på alle mulige leder og kanter, og ROLLUP og CUBE er bare simplifikationer af de mest benyttede anvendelser af grouping sets. Heldigvis kan grouping sets også simplificere en GROUP BY til kun at lave de totaler, jeg fra starten efterspurgte. Lad mig vise et eksempel, som tager udgangspunkt i eksemplet fra uge 41 i 2015:

SELECT dbname, type, SUM(colcount), COUNT(*)
FROM sysibm.systables
WHERE creator = 'SYSIBM'
GROUP BY GROUPING SETS((dbname, type), ())
ORDER BY dbname, type

Hele tricket ligger i den tomme parentes i specifikationen af GROUPING SETS. (dbname, type) laver den normale GROUP BY, og () laver totalerne. En almindelig GROUP BY col1/expression1, col2/expression2 kan altså skrives som GROUP BY GROUPING SETS((col1/expression1, col2/expression2)), men det er jo lige lovlig langt at skrive, og desuden kom GROUP BY uden dikkedarer til først. Med GROUPING SETS kan du helt sikkert lave nye spændende queries.

Forrige danske tip        Last tip in english        Tip oversigten