PostgreSQL - GROUP BY
Il PostgreSQL GROUP BYla clausola viene utilizzata in collaborazione con l'istruzione SELECT per raggruppare quelle righe in una tabella con dati identici. Questo viene fatto per eliminare la ridondanza nell'output e / o negli aggregati di calcolo che si applicano a questi gruppi.
La clausola GROUP BY segue la clausola WHERE in un'istruzione SELECT e precede la clausola ORDER BY.
Sintassi
Di seguito viene fornita la sintassi di base della clausola GROUP BY. La clausola GROUP BY deve seguire le condizioni della clausola WHERE e deve precedere la clausola ORDER BY, se utilizzata.
SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN
È possibile utilizzare più di una colonna nella clausola GROUP BY. Assicurati che qualunque colonna stai usando per raggruppare, quella colonna dovrebbe essere disponibile nell'elenco delle colonne.
Esempio
Considera che la tabella AZIENDA ha i record come segue:
# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Se desideri conoscere l'importo totale dello stipendio di ciascun cliente, la query GROUP BY sarà la seguente:
testdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
Ciò produrrebbe il seguente risultato:
name | sum
-------+-------
Teddy | 20000
Paul | 20000
Mark | 65000
David | 85000
Allen | 15000
Kim | 45000
James | 10000
(7 rows)
Ora, creiamo altri tre record nella tabella COMPANY utilizzando le seguenti istruzioni INSERT:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
Ora, la nostra tabella ha i seguenti record con nomi duplicati:
id | name | age | address | salary
----+-------+-----+--------------+--------
1 | Paul | 32 | California | 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall | 45000
7 | James | 24 | Houston | 10000
8 | Paul | 24 | Houston | 20000
9 | James | 44 | Norway | 5000
10 | James | 45 | Texas | 5000
(10 rows)
Ancora una volta, usiamo la stessa istruzione per raggruppare tutti i record usando la colonna NAME come segue:
testdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;
Ciò produrrebbe il seguente risultato:
name | sum
-------+-------
Allen | 15000
David | 85000
James | 20000
Kim | 45000
Mark | 65000
Paul | 40000
Teddy | 20000
(7 rows)
Usiamo la clausola ORDER BY insieme alla clausola GROUP BY come segue:
testdb=# SELECT NAME, SUM(SALARY)
FROM COMPANY GROUP BY NAME ORDER BY NAME DESC;
Ciò produrrebbe il seguente risultato:
name | sum
-------+-------
Teddy | 20000
Paul | 40000
Mark | 65000
Kim | 45000
James | 20000
David | 85000
Allen | 15000
(7 rows)