私はあなたの質問をこのように理解しています。 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