Kodulehed
[386] - Andmebaasid I (ITI0206) (kevad 2024)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / SQL

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Anonüümne (01.04.2024 14:02):
Kuidas teistes andmebaasisüsteemides realiseerida PostgreSQLi FILTER predikaati, mida saab kasutada koos kokkuvõttefunktsiooniga?
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.

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 vastust:

Keskmine hinne : Pole veel hinnanguid!