私はあなたの質問をこのように理解しています。 2018年1月1日から2018年1月12日までの期間に3人のユーザー(user_id =1,2,3)がログインしました。これらのユーザーのうち、user_id 1は合計250回の支払いを2回行い、user_id 2は40回の支払いを1回行い、user_id 3は0回の支払いを行ったため、合計は0になります。したがって、0-200の範囲に2つの値があります。 、および200 +の範囲の1 。それが正しい理解である場合、このクエリは望ましい結果をもたらします:
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;
出力:
diapason number_of_users
0-200 2
200 + 1
更新
合計number_of_usersで別の行を追加するには 、WITH ROLLUPを追加するだけです GROUP BYへ 条項:
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
出力:
diapason number_of_users
0-200 2
200 + 1
(null) 3
アプリケーションフレームワークでは、diapasonという事実を使用できます。 値はNULLです Totalのようなものを出力します 代わりに。
MySQLでも同じことができます(このSQLFiddle
を参照してください。 )このクエリをサブクエリとしてラップし、COALESCEを使用します diapasonで 桁。その場合、出力は次のようになります。
diapason number_of_users
0-200 2
200 + 1
Total 3