Vastus (01.04.2024 15:10): PostgreSQLis saab kokkuvõttefunktsioonidega (nt Count, Min, Max, Sum, Avg) koos kasutada
FILTER klauslit, et piirata ridu, mis lähevad kokkuvõttefunktsiooni tulemuse arvutamisel sisendiks. See võimaldab ühe ja sama lausega küsida samast tabelist koondtulemusi erinevatele tingimustele vastavate ridade põhjal.
Oletame, et SQL-andmebaasis on tabel
Hotell:
Hotell(hotelli_nr, nimi, linn)
Primaarvõti(hotelli_nr)
Ülesandeks oleks leida sama lausega Tallinnas olevate hotellide arv ja Tartus olevate hotellide arv.
PostgreSQLSELECT Count(*) FILTER (WHERE linn='Tallinn') AS tallinna_hotellide_arv,
Count(*) FILTER (WHERE linn='Tartu') AS tartu_hotellide_arv
FROM Hotell;
Alternatiivsed lahendused põhinevad Count funktsiooni omadusel, et Count(<avaldis>) loendab vaid ridu, kus avaldise arvutamise tulemus ei ole NULL.
MS Access
SELECT Count(iif(linn='Tallinn',linn,NULL)) AS tallinna_hotellide_arv,
Count(iif(linn='Tartu',linn,NULL)) AS tartu_hotellide_arv
FROM Hotell;
iif funktsioonil on kolm parameetrit -
- esimese oodatav väärtus on kontrollitav tingimus,
- teise oodatav väärtus on funktsiooni tulemus, kui tingimuse kontrolli tulemus on TRUE,
- kolmanda oodatav väärtus on funktsiooni tulemus, kui tingimuse kontrolli tulemus on FALSE.
PostgreSQL (ilma FILTER kasutuseta)
SELECT Count(CASE WHEN linn='Tallinn' THEN linn ELSE NULL END) AS tallinna_hotellide_arv,
Count(CASE WHEN linn='Tartu' THEN linn ELSE NULL END) AS tartu_hotellide_arv
FROM Hotell;
Kasutatakse
CASE avaldist.