Az SQL szerver SELECT utasítását nap mint nap használjuk különféle alkalmazásainkban. Most induló sorozatunkban bonyolultabb lekérdezések készítésébe kezdünk, és megnézzük, hogy mit tud nyújtani az utasítás ezek elkészítéséhez. Először a csoportokat képző GROUP BY formula lehetőségeit taglaljuk.

Cikkünk írásakor előfeltételnek tekintjük, hogy az olvasó már használta a SELECT utasítást WHERE kulcsszóval kiegészítve egyszerű lekérdezésekhez.
GROUP BY feltétel jelentése
A GROUP BY csoportokat képez a SELECT által lekérdezett sorokból. Ha összegző függvények (pl. SUM()) találhatóak a SELECT által definiált eredménymezőkben, akkor minden csoportnak a saját összegét kiszámítja. Használatakor minden olyan oszlopnak szerepelnie kell a GROUP BY listában vagy kifejezésben, amely nem tartalmaz összegző függvényeket, és a SELECT után megadtuk. A GROUP BY kulcsszó használata esetén javasolt a rendezés (ORDER BY) alkalmazása. Együtt használható a WHERE feltétellel, a kihagyott sorokat nem használja fel a csoportosításhoz.
GROUP BY szintaktika
[ GROUP BY [ ALL ] group_by_expression [ ,...n ] [ WITH { CUBE | ROLLUP } ] ]
Paraméterek
Itt adjuk meg a csoportosító kifejezést, amelyet oszlopként használunk. Maga a kifejezés lehet oszlop, vagy olyan kifejezés, amelyben nem szerepel összegző függvény. A text, ntext és image típusok nem használhatók.
Példáinkban az SQL szerveren megtalálható Northwind adatbázist használjuk.
SELECT Region, COUNT(*) AS [Customers Count]
FROM Customers
WHERE Country = 'USA'
GROUP BY Region
Megjelenít minden csoportot és eredményhalmazt, még azokat is, amelyeket a WHERE feltételben szereplő keresés kizárna. Az ALL paraméter nem használható a CUBE és ROLLUP kulcsszókkal együtt.
SELECT Region, COUNT(*) AS [Customers Count]
FROM Customers
WHERE Country = 'USA'
GROUP BY ALL Region
Ha az előző lekérdezésből kihagyjuk a WHERE feltételt, akkor a számlált összeg az USA-n kívüli országokat tartalmazó csoportokra is kiértékelődik. Az ALL kulcsszó ebben az esetben már felesleges.
SELECT Region, COUNT(*) AS [Customers Count]
FROM Customers
GROUP BY Region
Hasonló példát látunk csoportosításra. Itt két csoportosító tulajdonságot használunk. Ügyeljünk arra, hogyha több eredményoszlopot adunk meg, akkor azt az oszlopot szerepeltetni kell a GROUP BY feltétel csoportosító tulajdonságai között is.
SELECT Region, City, COUNT(*) AS [Customers Count]
FROM Customers
GROUP BY Region, City
A csoportosító sorokon kívül még minden megadott csoport és alcsoport szerinti összegző sort ad az eredményhez. A csoportosító tulajdonság NULL értékként szerepel az eredménysorban. Az így kapott ún. kocka dimenziója attól függ, hogy hány csoportosító operandust használunk.
SELECT EmployeeID AS Alkalmazott, ShipVia AS Szállító, SUM(Freight) [Szállítmány Összes]
FROM Orders
WHERE EmployeeID < 3
GROUP BY EmployeeID, ShipVia WITH CUBE
Hasonló összesítésre használható, mint a CUBE, azzal a különbséggel, hogy nem készül el az összes lehetséges összegző sor, hanem csak a hierarchia szerint alacsony szinttől növekedve a csúcsig a csoportosító feltételek megadott sorrendje szerint.
SELECT EmployeeID AS Alkalmazott, ShipVia AS Szállító, SUM(Freight) [Szállítmány Összes]
FROM Orders
WHERE EmployeeID < 3
GROUP BY EmployeeID, ShipVia WITH ROLLUP

Fontos tudnivaló! DISTINCT kulcsszó nem használható együtt a CUBE és ROLLUP paraméterekkel. Együttes használatuk esetén hibaüzenetet kapunk.
Zavaró lehet, ha a lekérdezett adatok között NULL érték található, hiszen a csoportosító sorokat is NULL-ként kapjuk vissza. A megkülönböztetésre használjuk a GROUPING függvényt, amelynek paramétere az adott oszlop, és visszaadott értéke 1, ha az adott sort a CUBE vagy ROLLUP funkció adta az eredményhez, és 0, ha NULL érték van az eredményben.
SELECT CASE WHEN (GROUPING(TitleOfCourtesy) = 1) THEN 'ALL' ELSE ISNULL(TitleOfCourtesy, 'UNKNOWN')
END AS TitleOfCourtesy,
CASE WHEN (GROUPING(City) = 1) THEN 'ALL'
ELSE ISNULL(City, 'UNKNOWN') END AS City,
COUNT(*)
FROM Employees
GROUP BY TitleOfCourtesy, City WITH CUBE
A Transact-SQL SELECT utasítás cikksorozat