Cum funcționează
Tiparul canonic e la tabelul Carti. Problema e notabilă pentru că
inversează ordinea obişnuită: cerința c) modifică, iar d) afişează. Instrucţiunile se scriu în
ordinea din enunț, deci rezultatul de la d) reflectă deja modificarea făcută la c).
d) Agregare pe coloană calculată
Aceasta e cea mai bogată interogare din toate subiectele: combină un calcul, o funcţie de agregare
şi o grupare.
SELECT Produs, SUM(Pret_buc * Nr_buc) AS Pret_total
FROM Materiale
GROUP BY Produs;
Se citeşte în trei paşi:
Pret_buc * Nr_buc — pentru fiecare rând, preţul total al acelui material
SUM(...) — adună aceste valori
GROUP BY Produs — adunarea se face separat pentru fiecare produs
Pentru raft, după modificarea de la c):
Surub 10mm 0.55 × 48 = 26.40
Piulita 10mm 0.24 × 48 = 11.52
Placute de fixare 0.74 × 8 = 5.92
Cheie 10-11mm 2.00 × 1 = 2.00
-------
45.84
Pentru scaun: 0.60 × 8 + 2.00 × 1 = 6.80.
Diferenţa faţă de tabelul Filme, unde se folosea AVG(Durata) pe o
coloană existentă: aici valoarea agregată nu există în tabel, se calculează din două coloane.
Funcţiile de agregare acceptă orice expresie, nu doar nume de coloane.
SUM(Pret_buc * Nr_buc) nu e acelaşi lucru cu SUM(Pret_buc) * SUM(Nr_buc). Prima înmulţeşte
apoi adună (corect), a doua adună apoi înmulţeşte (fără sens). Ordinea operaţiilor contează.
c) De ce e nevoie de două condiţii
„Cheie 10-11mm" apare de două ori în tabel, o dată pentru fiecare produs. Acelaşi lucru s-ar
putea întâmpla cu plăcuţele. De aceea identificarea se face şi după denumire, şi după produs:
WHERE Denumire = 'Placute de fixare' AND Produs = 'raft'
Doar după denumire ai risca să modifici plăcuţele de la toate produsele.
Greșeli frecvente
SUM(Pret_buc) * SUM(Nr_buc) — ordinea operaţiilor e inversată, rezultatul n-are sens.
GROUP BY uitat — se obţine o singură sumă, pe tot tabelul.
SELECT Denumire, SUM(...) cu GROUP BY Produs — coloană care nu e în gruparea.
- Inversarea ordinii cerinţelor — d) trebuie să reflecte modificarea de la c).
- O singură condiţie la c) — materialele se repetă între produse.