Windows - A Transact-SQL SELECT utasításban rejlő lehetőségek

1. rész

forráskód letöltése
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
  • group_by_expression
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
  • ALL
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
  • CUBE
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
  • ROLLUP
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