Olyan lekérdezések írása, amelyek több csoportosítást határoznak meg csoportosítási csoportokkal

Befejeződött

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.