DEV Community

Cover image for Osztályközök képzése SQL-ben (GROUP BY trükk)

Osztályközök képzése SQL-ben (GROUP BY trükk)

Ebben a rendkívül rövid blogbejegyzésben arról fogok értekezni, hogyan lehet osztályközös lekérdezést létrehozni SQL nyelven. A példához MSSQL-t használok majd, de mivel az SQL szintaxisok nagyon hasonlóak, így ezt bármelyik SQL dialektusban meg lehet oldani.
Itt is van a mérhetetlenül egyszerű lekérdezés:

SELECT
    amount / 200000 * 200000 AS BinStart,
    amount / 200000 * 200000 + 199999 AS BinEnd,
    COUNT(*) AS Count
FROM Salaries
WHERE end_date IS NULL
GROUP BY
    amount / 200000;
Enter fullscreen mode Exit fullscreen mode

A tábla maga így néz ki:

CREATE TABLE Salaries (
  salary_id int PRIMARY KEY IDENTITY(1, 1),
  employee_id int,
  amount int,
  start_date date,
  end_date date,
  registered datetime DEFAULT (GETDATE())
)
Enter fullscreen mode Exit fullscreen mode

Hogyan működik a lekérdezés?

Az alábbi sor alakítja ki az osztályközöket úgy, hogy az "amount" oszlop értékét osztja, majd megszorozza az osztályköz hosszával:
amount / 200000 * 200000 AS BinStart
Ha belegondolunk, itt nyilván egy egész számot fogunk kapni, ami megmondja, hogy hány egészszer van meg a fizetésben az osztályköz hosszával egyenlő szám. Azért nem szükséges a FLOOR alkalmazása, mert az MSSQL erősen típusos, és integert osztunk integerrel. Ez viszont nem azt jelenti, hogy más adatbázisrendszernél ez így működik. MySQL-ben például szükséges lenne a FLOOR alkalmazása.
Ha az eredményt beszorozzuk az osztályköz hosszával, akkor nyilván n-szer kapjuk meg az annak nagyságát. Az osztályköz felső határát az összeadás biztosítja. A "GROUP BY" művelet segítségével csoportosítunk aszerint, hogy hányszor egészszer van meg a fizetésben az osztályköz hossza.
A "WHERE end_date IS NULL" azért került oda, mert a táblában az aktuális fizetésnél az "end_date" mező értéke null.

Top comments (0)