Olyan lekérdezések írása, amelyek több csoportosítást határoznak meg csoportosítási csoportokkal
A GROUP BY záradékot a Transact-SQL Standard kiadás LECT utasításában használva csoportokba rendezheti a sorokat, általában az összesítések támogatásához. Ha azonban egyszerre különböző attribútumok szerint kell csoportosítania, például különböző szinteken történő jelentéskészítéshez, általában több lekérdezésre lenne szükség az UNION ALL-jal kombinálva. Ehelyett, ha több csoportosítás összesítését kell létrehoznia ugyanabban a lekérdezésben, használhatja a GROUPING Standard kiadás TS alklámot a Transact-SQL grouping Standard kiadás TS záradékában. A GROUPING Standard kiadás TS alternatívát kínál arra, hogy az UNION ALL használatával kombinálja az eredményeket több egyedi lekérdezésből, amelyek mindegyike saját GROUP BY záradékkal rendelkezik.
A GROUPING Standard kiadás TS-alklám használata
A GROUPING Standard kiadás TS használatához meg kell adnia az attribútumok kombinációit, amelyekre csoportosítani kell, ahogyan az alábbi szintaxisbeli példában is látható:
SELECT <column list with aggregate(s)>
FROM <source>
GROUP BY
GROUPING SETS(
(<column_name>),--one or more columns
(<column_name>),--one or more columns
() -- empty parentheses if aggregating all rows
);
Tegyük fel például, hogy a GROUPING Standard kiadás TS használatával szeretné összesíteni a Sales.CategorySales tábla Kategória és Cust oszlopait az üres zárójelek jelölése mellett az összes sor összesítéséhez:
SELECT Category, Cust, SUM(Qty) AS TotalQty
FROM Sales.CategorySales
GROUP BY
GROUPING SETS((Category),(Cust),())
ORDER BY Category, Cust;
Az eredmény így nézhet ki:
Kategória | Vevő | TotalQty |
---|---|---|
NULL | NULL | 999 |
NULL | 1 | 80 |
NULL | 2 | 12 |
NULL | 3 | 154 |
NULL | 4 | 241 |
NULL | 5 | 512 |
Italok | NULL | 513 |
Fűszerek | NULL | 114 |
Édesség | NULL | 372 |
Figyelje meg a NULL-ek jelenlétét az eredményekben. Az NULL-ek visszaadhatók, mert a null érték a mögöttes forrásban lett tárolva, vagy azért, mert egy összesített eredményként létrehozott sorban lévő helyőrző. Az előző eredményekben például az első sor jelenik meg NULL, NULL, 999
. Ez egy végösszegsort jelöl. A Kategória és a Cust oszlop null értéke helyőrző, mert sem a Kategória, sem a Cust nem vesz részt az összesítésben.
Tipp.
Ha tudni szeretné, hogy a NULL jelöli-e a helyőrzőt, vagy az alapul szolgáló adatokból származik, használhatja a GROUPING_ID. További információért látogasson el a GROUPING_ID referenciaoldalára.
A KOCKA és a ROLLUP alklámok használata
A GROUPING Standard kiadás TS-hez hasonlóan a KOCKA és a ROLLUP alklámok több csoportosítást is lehetővé tesznek az adatok összesítéséhez. A KOCKA és a ROLLUP azonban nem szükséges minden csoportosítandó attribútumkészletet megadnia. Ehelyett egy oszlopkészlettel a KOCKA határozza meg az összes lehetséges kombinációt és kimeneti csoportosítást. A ROLLUP kombinációkat hoz létre, feltéve, hogy a bemeneti oszlopok egy hierarchiát képviselnek. Ezért a KOCKA és a ROLLUP a CSOPORTOSÍTÁS Standard kiadás TS parancsikonjaként is felfogható.
A KOCKA használatához fűzze hozzá a KOCKA kulcsszót a GROUP BY záradékhoz, és adja meg a csoportosítandó oszlopok listáját. Ha például a Kategória és a Cust oszlopok összes kombinációjára szeretne csoportosítani, a következő szintaxist használhatja a lekérdezésben:
SELECT Category, Cust, SUM(Qty) AS TotalQty
FROM Sales.CategorySales
GROUP BY CUBE(Category,Cust);
Ez a következő kombinációk csoportosítását adja eredményül: (Kategória, Cust), (Cust, Category), (Cust), (Category) és az összes üres ():
Kategória | Vevő | TotalQty |
---|---|---|
Italok | 1 | 36 |
Fűszerek | 1 | 44 |
NULL | 1 | 80 |
Italok | 2 | 5 |
Édesség | 2 | 7 |
NULL | 2 | 12 |
Italok | 3 | 105 |
Fűszerek | 3 | 4 |
Édesség | 3 | 45 |
NULL | 3 | 154 |
... | ||
NULL | NULL | 999 |
Italok | NULL | 513 |
Fűszerek | NULL | 114 |
Édesség | NULL | 372 |
A ROLLUP használatához fűzze hozzá a ROLLUP kulcsszót a GROUP BY záradékhoz, és adja meg a csoportosítandó oszlopok listáját. Ha például a Kategória, az Alkategória és a Termék oszlop kombinációira szeretne csoportosítani, a következő szintaxist használhatja a lekérdezésben:
SELECT Category, Subcategory, Product, SUM(Qty) AS TotalQty
FROM Sales.ProductSales
GROUP BY ROLLUP(Category,Subcategory, Product);
Ez a következő kombinációk csoportosítását eredményezné: (Kategória, Alkategória, Termék), (Kategória, Alkategória), (Kategória) és az összes üres () összesítés. Az oszlopok megadásának sorrendje számít: a ROLLUP feltételezi, hogy az oszlopok hierarchia-kifejező sorrendben vannak felsorolva. Részösszegeket biztosít az egyes csoportosításokhoz, valamint a végösszeget az összes csoportosításhoz.