Kuidas teistes andmebaasisüsteemides realiseerida PostgreSQLi FILTER predikaati, mida saab kasutada koos kokkuvõttefunktsiooniga?

Postitas Erki Eessaar 01.04.2024 14:37 (muudeti 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.

PostgreSQL

SELECT 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.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!