La clausola group by
Forma generale
La forma generale di una query che utilizza la GROUP BY è riportata di seguito:
SELECT . . . FROM . . .
GROUP BY nome_col1 [,nome_col2,. . .];
La specificazione di questa clausola ha l'effetto di ottenere una tupla per ciascuna di quelle che hanno lo stesso valore per l'attributo, o per gli attributi, specificato dopo la parola chiave GROUP BY. In ciascuna delle tuple così composte, analogamente a quanto avviene quando si calcola una funzione colonna, non saranno più disponibili i dati delle tuple originali. Al loro posto, potranno essere elencati i seguenti valori:
- Tutte le funzioni colonna;
- Qualunque attributo specificato di seguito alla parola GROUP BY.
Le conseguenze di GROUP BY
Nella prossima query sono riassunte le considerazioni che abbiamo appena evidenziato. Per ovvi motivi sono state elencate soltanto le funzioni che ritenevamo significative per la comprensione e l'unico attributo originale ammesso in quanto argomento della GROUP BY. Avvertiamo che alcune funzioni, p.e. sum(lit), sono state incluse solamente a titolo dimostrativo non avendo alcun significato logico.
Come possiamo vedere la cardinalità della relazione risultato, e questo vale come regola generale, è pari al numero di valori differenti nell'attributo riferito nella GROUP BY. Alla luce di precedenti osservazioni, vogliamo ribadire che non sono disponibili nella stessa relazione, i dati relativi a nome, uso, consumo di carburante a due regimi di funzionamento, in quanto questi valori vengono persi a seguito dell'operazione di raggruppamento effettuata su un'altra colonna.
SELECT sum(lit), count(*), count(ggc), avg(ggc), sum(ggc), nocasa
FROM modello
GROUP BY nocasa;
| SUM(LIT) | COUNT(*) | COUNT(GGC) | AVG(GGC) | SUM(GGC) | NOCASA |
|---|---|---|---|---|---|
| 121204 | 4 | 1 | 0 | 0 | 0 |
| 352038 | 2 | 2 | 360 | 720 | 2 |
| 58038 | 5 | 5 | 12 | 60 | 3 |
| 654321 | 1 | 1 | 17 | 17 | 4 |
Adesso siamo in grado di correggere la query [30] e di risolvere un problema simile: vogliamo calcolare il numero di auto di tipo utilitaria, in modo tale che accanto al valore corrispondente sia indicata la tipologia di uso. La query ed il risultato sono riportati di seguito.