CATEGORII DOCUMENTE |
Uneori am putea dori sa grupam liniile dintr-o tabela si sa obtinem anumite informatii despre grupurile respective.
De exemplu am dori sa calculam numarul total de voturi obtinut de fiecare candidat in toata tara. Cu ceea ce am invatat pana acum, am putea rula o comanda de forma celei de mai jos pentru fiecare candidat in parte
SELECT sum(numar_voturi)
FROM voturi
WHERE candidat=1 Tabelul II.4.12.
SUM(NUMAR_VOTURI) |
insa aceasta metoda nu este convenabila, intrucat am dori sa obtinem un tabel cu toate aceste date, ca in tabelul II.4.13.
O astfel de grupare a datelor se poate face folosind clauza GROUP BY. Comanda care a fost rulata pentru a obtine rezultatul din tabelul II.4.13, este:
SELECT candidat, sum(numar_voturi) AS 'TOTAL VOTURI'
FROM voturi
GROUP BY candidat
Tabelul II.4.13.
CANDIDAT |
TOTAL VOTURI |
Tabelul II.4.14.
CANDIDAT |
NUMAR_VOTURI |
Se observa ca pentru fiecare grup de inregistrari s-a obtinut cate o singura valoare, adica pentru fiecare candidat am obtinut o suma a tuturor voturilor primite. De exemplu candidatul cu codul 1 a obtinut in Bucuresti voturi, la Iasi voturi iar la Sibiu voturi, in total voturi adica exact valoarea din tabelele II.4.12 si II.1.3.
Clauza GROUP BY poate fi folosita si fara functii de grup, doar pentru a afisa liniile grupate dupa anumit criteriu, ca in exemplul urmator:SELECT candidat,numar_voturi FROM voturi
GROUP BY candidat, numar_voturi
Sa vedem acum de exemplu cum aflam procentul mediu obtinut de catre fiecare candidat.
SELECT candidat,AVG(100*numar_voturi/numar_alegatori)
FROM voturi v, judete j WHERE v.judet=j.cod_judet
GROUP BY candidat
Tabelul II.4.15.
CANDIDAT |
AVG(100*NUMAR_VOTURI/NUMAR_ALEGATORI) |
In clauza GROUP BY nu se accepta aliasele coloanelor, comanda urmatoare va genera o eroare
SELECT department_id As Departament
job_id, MAX(salary)
FROM employees GROUP BY Departament, job_id
-toate campurile care apar in select in afara functiilor de grup trebuie sa apara in clauza BROUP BY ca in exemplele de mai jos:
SELECT department_id, job_id, MAX(salary)
FROM employees GROUP BY department_id, job_id
sau
SELECT department_id, department_name, max(salary)
FROM employees NATURAL JOIN departments
GROUP BY department_id, department_name
sau
SELECT upper(last_name), sum(salary)
FROM employees GROUP BY last_name
Observati in acest ultim exemplu ca desi in clauza SELECT campului last_name ii este aplicata o functie (simpla nu de grup!) , in clauza GROUP BY last_name poate sa apara fara functia respectiva. Aveti grija sa nu confundati functiile singulare cu cele de grup!
-Nu se pot folosi functii de grup in clauza WHERE. De aceea urmatoarea comanda nu va putea fi rulata ea generand o eroare:
SELECT * FROM voturi
WHERE numar_voturi=max(numar_voturi)
Pentru a putea afla ce candidat/candidati au obtinut cele mai multe voturi vom folosi o subinterogare (asupra acestui subiect vom reveni in capitolul urmator) astfel
SELECT * FROM voturi
WHERE numar_voturi =
(SELECT max(numar_voturi) from voturi)
-in clauza GRUP BY pot sa apara si alte coloane care nu apar in SELECT
SELECT MAX(salary) FROM employees
GROUP BY departments
-functiile de grup pot fi imbricatre ca in exemplul urmator, in care am determinat cel mai mare numar total de voturi obtinut de catre un candidat.
SELECT max(sum(numar_voturi)) FROM voturi
GROUP BY candidat
Tabelul II.4.16.
MAX(SUM(NUMAR_VOTURI)) |
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1531
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved