SQL Server 2008 BI és DW újdonságok - Grouping Sets
Folytassuk az SQL Server 2008 Üzleti intelligencia és adattárház újdonságait bemutató cikksorozatunkat a „Grouping sets"-tel
A Grouping sets-ek segítségével sokkal precízebben aggregálhatjunk adatainkat, mint azt eddig tehettük, és ennek legjobban a relációs riportinggal foglalkozó kollegák örülnek majd.
Ha egy mondatban kéne elmagyaráznom, hogy mi is az a Grouping Set, akkor azt az alábbi módon tenném: GROUP BY a, b, c WITH CUBE tökéletesen ekvivalens a GROUP BY GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( )) kifejezéssel
De szerencsére nem csak egy mondattal kell elmagyaráznom, hogy mire jó az SQL 2008 grouping sets, úgyhogy kezdjünk is bele. De előtte tekintsük át milyen lehetőségein voltak SQL 2008 előtt az agrregálásra, vagy más szóval a részösszegek megjelenítésére a riportokon:
- GROUP BY: A group by segítségével az összes Group by oszlopra kaptunk egy összeget. (pont annyit amennyi a distinct elemek kombinációja meghatároz). Más szóval: a SELECT a, b, SUM(c) FROM t GROUP BY a, b ekvivalens a SELECT a, b, SUM(c) FROM t GROUP BY GROUPING SETS ( (a,b) ) kifejezésessel
- WITH ROLLUP: A WITH ROLLUP segítségével a distinct elemek kombinációja által meghatározott összegeken kívül megkaptuk az egyes oszlopok részösszegét is, de a WITH ROLLUP csak balról jobbra aggregált, jobról balra nem. (így nem állította elő az összes lehetséges aggregációt) Más szóval a ROLLUP (a, b, c) azonos GROUPING SETS ( (a, b, c), (a, b), (a), ( )) -vel. OLAP-os terminológiával élve pedig ROLLUP úgy magyarázható el legszemléletesebben, hogy az visszaadja a kibontott hierarchiát, ahol a, b, és c az egyes szinteket reprezentálják.
- WITH CUBE: A WITH CUBE visszaadja az összes lehetséges aggregációt. OLAP-os terminológiával élve visszaadja a dimenzióelemek lehetséges kombinációját és az ahhoz tartozó részösszegeket.
Ezek a felösszegzési módszerek nem támogatták az olyan lekérdezéseket, mint például a válogassuk le egyszerre az
- összes forgalmat vevőnként az összes cikkre és az
- összes forgalmat cikkenként az összes vevő és az
- összes forgalmat
SQL Server 2008 előtt ezt 3 lekérdezés uniójával tudtuk csak előállítani. SQL 2008 után azonban lehetőségünk lesz az alábbi lekérdezés összeállítására:
Select cikk, vevo, SUM(ft)
from t
group by grouping sets (cikk, vevo, ())
és az eredmény:
SQL Server 2008 Grouping Sets
A Grouping Sets előnye:
- Sokkal könnyebb lesz parametrizálható lekérdezéseket, vagy lekérdezés szerkesztőt írnia, mint eddig
- Sokkal könnyebb lesz karbantartani a Grouping Sets-es lekérdezéseket, mint a UNION-osokat
- És a sokkal hatékonyabb, mint a UNION-os
Egy kódfoszlány többet ér 1000 szónál - tartja a régi közmondás. Épp ezért készítettem egy SQL scriptet, amely tartalmazza a grouping sets-ek működésének alapjait. Próbálja ki! Egy perc alatt meg fogja érteni és még demó adatbázis sem kell hozzá.
Kővári Attila - BI projekt
Új hozzászólás