Problem:
Chcesz pogrupować swoje dane według dwóch kolumn, aby móc policzyć trochę statystyk.
Przykład:
W order
tabela, masz kolumny order_date
, product_id
, customer_id
i number
. Chciałbyś policzyć liczbę produktów kupionych przez każdego klienta każdego dnia.
order
tabela wygląda tak:
data_zamówienia | product_id | identyfikator_klienta | liczba |
---|---|---|---|
25.11.2020 | 7 | 1 | 1 |
25.11.2020 | 12 | 1 | 3 |
26.11.2020 | 53 | 1 | 2 |
26.11.2020 | 1 | 2 | 4 |
26.11.2020 | 3 | 2 | 1 |
26.11.2020 | 16 | 2 | 7 |
26.11.2020 | 3 | 3 | 2 |
27.11.2020 | 6 | 3 | 1 |
Rozwiązanie:
SELECT order_date, customer_id, SUM(number) AS products_number FROM order
Wynik:
data_zamówienia | identyfikator_klienta | products_number |
---|---|---|
26.11.2020 | 3 | 2 |
27.11.2020 | 3 | 1 |
26.11.2020 | 2 | 12 |
25.11.2020 | 1 | 4 |
26.11.2020 | 1 | 2 |
Dyskusja:
Aby pogrupować według dwóch kolumn, po prostu użyj GROUP BY
z dwiema kolumnami. Nazwy kolumn powinny być wymienione po GROUP BY
słowa kluczowego i oddzielone przecinkiem. Grupy zostaną utworzone na podstawie wartości obu kolumn; dla każdej pary wartości tworzona jest osobna grupa (np. ('2020-11-25', 1)
). Spójrz na poniższą tabelę, gdzie każda grupa jest przedstawiona w innym kolorze:
data_zamówienia | identyfikator_klienta | product_id | liczba |
---|---|---|---|
2020-11-25 | 1 | 7 | 1 |
25.11.2020 | 1 | 12 | 3 |
26-11-2020 | 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 |
Jeśli jedna lub obie kolumny mają NULLs
wartości, te wartości są traktowane jako osobna grupa (np. ('2020-11-26', NULL)
, (NULL, 5)
lub (NULL, NULL)
).
Z drugiej strony, jeśli istnieją NULLs
w kolumnie, na której stosujemy funkcję agregującą, NULLs
wartości są po prostu pomijane. (W tym przykładzie funkcją agregującą jest SUM()
a kolumna to number
). Gdybyśmy mieli wartości liczbowe 2 , 1 i NULL dla jednej z grup SUM(number)
równałoby się 3
(2
i 1
są dodawane razem, a NULLs
jest pominięty).
Podobnie możesz pogrupować według dowolnej liczby kolumn – po prostu wpisz nazwy kolumn w GROUP BY
klauzuli i oddziel je przecinkami.