Ik begrijp uw vraag als volgt. U had 3 gebruikers (user_id=1,2,3) login in de periode 01.01.2018-12.01.2018. Van die gebruikers heeft user_id 1 2 betalingen gedaan van in totaal 250, user_id 2 heeft 1 betaling van 40 gedaan en user_id 3 heeft 0 betalingen gedaan, dus hun totaal is 0. Er zijn dus 2 waarden in het bereik 0-200
, en 1 in het bereik 200 +
. Als dat het juiste begrip is, geeft deze zoekopdracht u de gewenste 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;
Uitgang:
diapason number_of_users
0-200 2
200 + 1
Bijwerken
Om nog een rij toe te voegen met het totaal number_of_users
, voeg gewoon WITH ROLLUP
toe naar de GROUP BY
clausule:
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
Uitgang:
diapason number_of_users
0-200 2
200 + 1
(null) 3
In uw applicatieframework kunt u gebruik maken van het feit dat de diapason
waarde is NULL
om iets als Total
uit te voeren in plaats daarvan.
Je kunt hetzelfde ook doen in MySQL (zie deze SQLFiddle
) door deze zoekopdracht in te pakken als een subquery en een COALESCE
. te gebruiken op de diapason
kolom. In dat geval zou de output zijn:
diapason number_of_users
0-200 2
200 + 1
Total 3