Rozumiem twoje pytanie w ten sposób. Miałeś 3 użytkowników (user_id=1,2,3) logowanie w okresie 01.01.2018-12.01.2018. Spośród tych użytkowników user_id 1 dokonał 2 płatności w łącznej wysokości 250, user_id 2 dokonał 1 płatności w wysokości 40, a user_id 3 dokonał 0 płatności, więc ich suma wynosi 0. Stąd są 2 wartości w zakresie 0-200
i 1 w zakresie 200 +
. Jeśli to jest prawidłowe zrozumienie, to zapytanie da pożądane wyniki:
SELECT CASE
WHEN amount < 200 THEN '0-200'
WHEN amount >= 200 THEN '200 +'
END AS diapason,
COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
FROM activity a
LEFT JOIN payments p ON p.user_id = a.user_id
WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
GROUP BY a.user_id) p
GROUP BY diapason;
Wyjście:
diapason number_of_users
0-200 2
200 + 1
Aktualizacja
Aby dodać kolejny wiersz z całkowitą number_of_users
, po prostu dodaj WITH ROLLUP
do GROUP BY
klauzula:
SELECT CASE
WHEN amount < 200 THEN '0-200'
WHEN amount >= 200 THEN '200 +'
END AS diapason,
COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
FROM activity a
LEFT JOIN payments p ON p.user_id = a.user_id
WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
GROUP BY a.user_id) p
GROUP BY diapason WITH ROLLUP
Wyjście:
diapason number_of_users
0-200 2
200 + 1
(null) 3
W swoim frameworku aplikacji możesz wykorzystać fakt, że diapason
wartość to NULL
aby wypisać coś takiego jak Total
zamiast tego.
Możesz również zrobić to samo w MySQL (zobacz ten SQLFiddle
), opakowując to zapytanie jako podzapytanie i używając COALESCE
na diapason
kolumna. W takim przypadku wynik będzie następujący:
diapason number_of_users
0-200 2
200 + 1
Total 3