CREATE DATABASE [SQL2008_GroupingSets] go USE [SQL2008_GroupingSets] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[t]') AND type in (N'U')) DROP TABLE [dbo].[t] GO CREATE TABLE dbo.t ( Cikk varchar(50) NULL, Vevo varchar(50) NULL, Ft int NULL ) ON [PRIMARY] GO Insert into t values ('Cikk1', 'Vevo1', 10) Insert into t values ('Cikk2', 'Vevo1', 10) Insert into t values ('Cikk3', 'Vevo1', 10) Insert into t values ('Cikk1', 'Vevo2', 20) Insert into t values ('Cikk2', 'Vevo2', 20) Insert into t values ('Cikk3', 'Vevo2', 20) go Select * from t --====================================================================================== -- Az összes lehetséges aggregáció előállítása a WITH CUBE segítségével --====================================================================================== Select cikk, vevo, SUM(ft) from t group by cikk, vevo with Cube --====================================================================================== -- Az összes lehetséges aggregáció előállítása a GROUPING SETS segítségével --====================================================================================== Select cikk, vevo, SUM(ft) from t group by grouping sets ((cikk, vevo), cikk, vevo, ()) --====================================================================================== -- A GROUPING SETS legnagyobb előnye, hogy segítségével sokkal precízebben -- szabályozhattjuk, hogy mit aggregálunk fel és mit nem, vagy másképpen -- fogalmazva milyen részösszegeket jelenítünk meg. -- Például állítsunk elő egy olyan lekérdezést, amely visszaadja -- az összes cikk forgalmát vevőnként, és -- az összes vevő forgalmát cikkek és -- az összes forgalmat: -- SQL 2008 előtt ezt csak UNION-ok segítségével tudtuk megoldani valahogy így: --====================================================================================== Select Null, Vevo, Sum(Ft) from t group by Vevo Union all Select Cikk, Null, Sum(Ft) from t group by Cikk Union All Select Null, Null, Sum(Ft) from t --====================================================================================== -- SQL 2008-tól ezt már meg tudjuk oldani egyszerűbben is: A GROUPING Set segítségével: --====================================================================================== Select cikk, vevo, SUM(ft) from t group by grouping sets (cikk, vevo, ()) go