Vaši otázku chápu takto. V období 01.01.2018-12.01.2018 jste měli přihlášení 3 uživatele (user_id=1,2,3). Z těchto uživatelů uživatel user_id 1 provedl 2 platby v celkové výši 250, user_id 2 provedl 1 platbu ve výši 40 a user_id 3 provedl 0 plateb, takže jejich součet je 0. Existují tedy 2 hodnoty v rozsahu 0-200
a 1 v rozsahu 200 +
. Pokud je to správné pochopení, tento dotaz vám poskytne požadované výsledky:
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;
Výstup:
diapason number_of_users
0-200 2
200 + 1
Aktualizovat
Chcete-li přidat další řádek s celkovým počtem number_of_users
, stačí přidat WITH ROLLUP
do GROUP BY
klauzule:
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
Výstup:
diapason number_of_users
0-200 2
200 + 1
(null) 3
Ve vašem aplikačním frameworku můžete využít fakt, že diapason
hodnota je NULL
pro výstup něco jako Total
místo toho.
Totéž můžete udělat také v MySQL (viz tento SQLFiddle
) zabalením tohoto dotazu jako dílčího dotazu a použitím COALESCE
na diapason
sloupec. V takovém případě by výstup byl:
diapason number_of_users
0-200 2
200 + 1
Total 3