Cum funcționează
a) MIN pe o coloană numerică
MIN(salariul) întoarce un singur rând cu cea mai mică valoare. Ca toate funcțiile de agregare,
ignoră valorile NULL: un angajat cu salariul necompletat nu devine „minimul 0".
Dacă s-ar cere și cine are salariul minim, MIN singur nu ajunge — ai nevoie de subinterogarea
din problema #127, varianta cu
MIN în loc de MAX.
b) Anul nașterii nu e o coloană — se calculează din CNP
Ca la problema #124, informația cerută nu
există ca atare în tabel. CNP-ul are forma S AA LL ZZ JJ NNN C:
| Poziții |
Ce conțin |
Exemplu 1850312335291 |
| 1 |
gen + secol |
1 → masculin, 1900–1999 |
| 2–3 |
anul, ultimele două cifre |
85 |
| 4–5 |
luna |
03 |
| 6–7 |
ziua |
12 |
| 8–9 |
județul |
33 |
Deci anul nașterii = secolul (din prima cifră) + SUBSTR(cnp, 2, 2).
Aici e capcana. SUBSTR(cnp, 2, 2) dă 85, iar '19' || '85' dă 1985 — corect. Dar pentru un
angajat cu CNP-ul care începe cu 5 (născut după 2000), aceeași concatenare cu '19' ar da 1901
în loc de 2001. Un secol greșit, invizibil într-un tabel cu zece rânduri. De aceea secolul se
decide cu CASE, nu se presupune.
Pe datele de test, în Administrativ sunt trei angajați născuți în 2001, 2003 și 1993 —
adică amândouă ramurile lui CASE se folosesc efectiv.
|| e operatorul de concatenare în SQL standard și în Oracle. Echivalente: & sau + în
Access, CONCAT(a, b) în MySQL, + în SQL Server.
Rezultatul e un șir ('2001'), nu un număr. Dacă îl vrei numeric — util dacă urmează un calcul
de vârstă — se convertește: CAST('19' || SUBSTR(cnp, 2, 2) AS INTEGER), respectiv
TO_NUMBER(...) în Oracle.
Greșeli frecvente
- Secolul presupus
19 — merge pe majoritatea rândurilor și greșește exact pe angajații tineri.
Rezultatul rămâne plauzibil (1901), deci nu se observă.
SUBSTR(cnp, 1, 2) în loc de SUBSTR(cnp, 2, 2) — iei cifra de gen împreună cu prima cifră a
anului (18 pentru 1850312...). Al doilea argument e poziția de start, al treilea e
câte caractere, nu poziția de sfârșit.
- Numerotare de la 0 —
SUBSTR(cnp, 0, 2) nu e greșeala evidentă pe care o pare: în Oracle merge
ca 1, în alte sisteme dă șir vid. Caracterele se numără de la 1.
MIN(salariul) afișat lângă nume — SELECT nume, MIN(salariul) FROM Angajati nu e o
interogare validă fără GROUP BY; unde merge totuși, numele afișat e ales arbitrar și, de obicei,
nu e al angajatului cu salariul minim.
CASE fără END — eroare de sintaxă. CASE ... END e o pereche, ca parantezele.
- Filtrarea pe
idd ghicit în loc de joncțiune pe denumirea departamentului.