Cum funcționează
COUNT cu WHERE — numărare condiționată
Ordinea de execuție explică totul: WHERE aruncă mai întâi filmele care nu sunt SF, apoi COUNT(*)
numără câte au rămas. Nu există „COUNT care numără doar SF-urile" — există un tabel filtrat, numărat
întreg.
De aici rezultă o variantă utilă când vrei mai multe numărători într-un singur rând:
SELECT COUNT(*) AS total,
SUM(CASE WHEN gen = 'SF' THEN 1 ELSE 0 END) AS nr_sf,
SUM(CASE WHEN gen = 'Drama' THEN 1 ELSE 0 END) AS nr_drama
FROM Filme;
WHERE poate filtra o singură dată; CASE înăuntrul lui SUM numără pe categorii în paralel. Nu e
cerut la atestat, dar e răspunsul la „cum le pun pe aceeași linie".
Dacă s-ar cere numărul de filme din fiecare gen, nu doar SF, atunci: GROUP BY gen — vezi
problema #148.
gen = 'SF' — o abreviere, deci majuscule
Aici comparația e simplă pentru că genul e o abreviere scrisă cu majuscule în ambele locuri. La
genurile scrise în cuvinte (Drama, Comedie), atenție la diacritice: dacă în tabel e Drama iar în
enunț „Dramă", condiția trebuie scrisă ca în tabel. Vezi
problema #149.
Greșeli frecvente
WHERE gen = 'sf' — în Oracle, zero rânduri. Rezultatul e 0, care arată ca un răspuns
valid.
COUNT(gen) cu WHERE gen = 'SF' — funcționează, dar COUNT(*) spune mai clar că numeri
filme.
SELECT titlu, COUNT(*) la cerința b) — nu se cere ce filme sunt, se cere câte sunt. Și fără
GROUP BY e oricum invalid.
WHERE gen LIKE 'SF' — LIKE fără % e identic cu =, doar mai lent.
ORDER BY uitat la a) — „ordine alfabetică" e parte din cerință, nu o sugestie.