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;
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())
)
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)