Jag förstår din fråga så här. Du hade 3 användare (user_id=1,2,3) inloggning under perioden 01.01.2018-12.01.2018. Av dessa användare gjorde user_id 1 2 betalningar på totalt 250, user_id 2 gjorde 1 betalning på 40 och user_id 3 gjorde 0 betalningar så deras totala summa är 0. Därför finns det 2 värden i intervallet 0-200
och 1 i intervallet 200 +
. Om det är rätt förståelse kommer denna fråga att ge dig de önskade resultaten:
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;
Utdata:
diapason number_of_users
0-200 2
200 + 1
Uppdatera
För att lägga till ytterligare en rad med det totala number_of_users
, lägg bara till WITH ROLLUP
till GROUP BY
klausul:
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
Utdata:
diapason number_of_users
0-200 2
200 + 1
(null) 3
I ditt applikationsramverk kan du använda det faktum att diapason
värdet är NULL
för att mata ut något som Total
istället.
Du kan också göra samma sak i MySQL (se denna SQLFiddle
) genom att slå in den här frågan som en underfråga och använda en COALESCE
på diapason
kolumn. I så fall skulle utdata vara:
diapason number_of_users
0-200 2
200 + 1
Total 3