MainframeSupports
tip uge 41/2015:

Da jeg oversatte mit tip om at lave summer og totaler uden at bruge GROUP BY, kom jeg i tanke om, at der i DB2 11 endelig er kommet en løsning, der er meget simplere at bruge end den, jeg beskrev i Uge 1/2015. For at bruge den nye løsning kræver det dog, at det DB2 system, du bruger løsningen på, udover at være på version 11 også skal være i såkaldt New Function Mode (NFM). Derfor kan det godt være, at du lidt endnu skal nøjes med fremgangsmåden beskrevet i uge 1 og så spændt vente på, at du for alvor kan tage dette tip i brug.

Med udgangspunkt i eksemplet fra uge 1 vil det samme resultat (sådan nogenlunde) kunne opnås med følgende SQL statement:

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

For det første er dette statement langt lettere at læse og forstå, og i forhold til en traditionel GROUP BY er den eneste forskel, at de kolonner, der skal laves totaler på undervejs, skal omgives af ROLLUP(). Når der som i dette eksempel kun er en enkelt kolonne at lave ROLLUP på, så laver DB2 en ekstra række til sidst med en total for hver af de kolonner, der indgår i GROUP'en. I forhold til uge 1 løsningen sparer du de to kolonner med den løbende sum væk, og du får totalen placeret logisk nedenunder de kolonner, der laves totaler på. Alt i alt er ROLLUP en kæmpe forenkling, og den rigtige måde at lave totaler på.

Hvis du angiver ROLLUP på flere kolonner, så vil der komme en del-total for hver gang, der er break på værdien i kolonnen længst til højre, næst længst til højre og så fremdeles. Du kan i ovenstående eksempel prøve at fjerne type = 'T' betingelsen og tilføje type til SELECT listen og ændre ROLLUP til ROLLUP(dbname, type). Nu vil du få del-totaler inden for hver database pr. type og stadig bevare den samlede total. Prøv også med ROLLUP(type, dbname) for at fornemme forskellen. De to forskellige ROLLUP's kan du faktisk få på een gang ved at skrive CUBE i stedet for ROLLUP. CUBE og ROLLUP giver samme resultat så længe, der kun er een kolonne i parentesen, men det bliver vildere og vildere med CUBE, desto flere kolonner, der medtages i parentesen.

Det kan godt være, at den DB2, du forsøger at udføre ovenstående eksempel på, er kommet i NFM, men det virker alligevel ikke. Så skyldes det, at nogen har valgt, at DB2 systemet endnu ikke skal kunne forstå alt det nye smarte SQL, der kommer i V11. Heldigvis kan du omgå denne tekniske handelshindring ved at udstede en SET CURRENT APPLICATION COMPATIBILITY = 'V11R1' lige før, du udfører dit ROLLUP eller CUBE SQL statement.

Forrige danske tip        Last tip in english        Tip oversigten