Problem:
Du vill gruppera dina data i två kolumner så att du kan räkna lite statistik.
Exempel:
I order
tabell, har du kolumnerna order_date
, product_id
, customer_id
och number
. Du skulle vilja räkna antalet produkter som köps av varje kund varje dag.
order
tabellen ser ut så här:
order_date | produkt-id | kund-id | nummer |
---|---|---|---|
2020-11-25 | 7 | 1 | 1 |
2020-11-25 | 12 | 1 | 3 |
2020-11-26 | 53 | 1 | 2 |
2020-11-26 | 1 | 2 | 4 |
2020-11-26 | 3 | 2 | 1 |
2020-11-26 | 16 | 2 | 7 |
2020-11-26 | 3 | 3 | 2 |
2020-11-27 | 6 | 3 | 1 |
Lösning:
SELECT order_date, customer_id, SUM(number) AS products_number FROM order
Resultatet är:
order_date | kund-id | products_number |
---|---|---|
2020-11-26 | 3 | 2 |
2020-11-27 | 3 | 1 |
2020-11-26 | 2 | 12 |
2020-11-25 | 1 | 4 |
2020-11-26 | 1 | 2 |
Diskussion:
För att gruppera efter två kolumner, använd helt enkelt GROUP BY
med två kolumner. Kolumnnamnen ska listas efter GROUP BY
nyckelord och avgränsade med kommatecken. Grupper kommer att skapas baserat på värdena för båda kolumnerna; för varje värdepar skapas en separat grupp (t.ex. ('2020-11-25', 1)
). Titta på tabellen nedan, där varje grupp presenteras i olika färger:
order_date | kund-id | produkt-id | nummer |
---|---|---|---|
2020-11-25 | 1 | 7 | 1 |
2020-11-25 | 1 | 12 | 3 |
2020-11-26 | 1 | 53 | 2 |
2020-11-26 | 2 | 1 | 4 |
2020-11-26 | 2 | 3 | 1 |
2020-11-26 | 2 | 16 | 7 |
2020-11-26 | 3 | 3 | 2 |
2020-11-27 | 3 | 6 | 1 |
Om en eller båda kolumnerna har NULL
värden behandlas dessa värden som en separat grupp (t.ex. ('2020-11-26', NULL)
, (NULL, 5)
eller (NULL, NULL)
).
Å andra sidan, om det finns NULLs
i en kolumn där vi tillämpar en aggregerad funktion, NULL
värden utelämnas helt enkelt. (I det här exemplet är aggregatfunktionen SUM()
och kolumnen är number
). Om vi hade talvärdena 2 , 1 och NULL för en av grupperna, SUM(number)
skulle vara lika med 3
(2
och 1
läggs ihop och NULL
är utelämnad.)
På samma sätt kan du gruppera efter valfritt antal kolumner – skriv bara kolumnnamnen i GROUP BY
och separera dem med kommatecken.