So verstehe ich deine Frage. Sie hatten 3 Benutzer (user_id=1,2,3) Login im Zeitraum 01.01.2018-12.01.2018. Von diesen Benutzern hat user_id 1 2 Zahlungen in Höhe von insgesamt 250 geleistet, user_id 2 hat 1 Zahlung in Höhe von 40 geleistet und user_id 3 hat 0 Zahlungen geleistet, sodass ihre Gesamtsumme 0 ist. Daher gibt es 2 Werte im Bereich 0-200
, und 1 im Bereich 200 +
. Wenn dies das richtige Verständnis ist, liefert Ihnen diese Abfrage die gewünschten Ergebnisse:
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;
Ausgabe:
diapason number_of_users
0-200 2
200 + 1
Aktualisieren
Um eine weitere Zeile mit der Gesamtzahl number_of_users
hinzuzufügen , fügen Sie einfach WITH ROLLUP
hinzu zu GROUP BY
Klausel:
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
Ausgabe:
diapason number_of_users
0-200 2
200 + 1
(null) 3
In Ihrem Anwendungsframework können Sie die Tatsache nutzen, dass der diapason
Wert ist NULL
um so etwas wie Total
auszugeben stattdessen.
Sie können dasselbe auch in MySQL tun (siehe dieses SQLFiddle
). ), indem Sie diese Abfrage als Unterabfrage einpacken und ein COALESCE
verwenden auf dem diapason
Säule. In diesem Fall wäre die Ausgabe:
diapason number_of_users
0-200 2
200 + 1
Total 3