2017-03-01 5 views
0

データベースからカウントを返すクエリがあります。クエリの出力例:データを範囲にグループ化する

23 
14 
94 
42 
23 
12 

クエリ:

SELECT COUNT(*) 
FROM `submissions` 
INNER JOIN `events` 
ON `submissions`.event_id = `events`.id 
WHERE events.user_id IN (
SELECT id 
FROM `users` 
WHERE users.created_at IS NOT NULL 
GROUP BY `events`.id 

簡単に出力を取ると値の事前定義された範囲(0〜100、101-200に分割する方法はあります、など)、特定の範囲に入る行の数を示しますか?

+0

opの結果に基づいて、期待される結果は何ですか? – Blank

答えて

1

select句にcase式を使用します。

SELECT `events`.id , 
case when COUNT(`events`.id) between 0 and 100 then '0 - 100' 
when COUNT(`events`.id) between 100 and 200 then '100 - 200' 
end as Range 
FROM `submissions` 
INNER JOIN `events` 
ON `submissions`.event_id = `events`.id 
WHERE events.user_id IN (
SELECT id 
FROM `users` 
WHERE users.created_at IS NOT NULL 
GROUP BY `events`.id 
+1

これは私のために働いた - 私はCASEステートメントについて知っていたが、残りのクエリとどのように統合するのか分からなかった。親切にありがとう! – mdobrenko

1

SUM()アグリゲーションを利用して条件付きカウントを使用します。

あなたが列にあなたの範囲が必要な場合は

SELECT SUM(CASE WHEN n BETWEEN( 0 AND 100) THEN 1 ELSE 0 END) '0-100', 
     SUM(CASE WHEN n BETWEEN(101 AND 200) THEN 1 ELSE 0 END) '101-200' 
     -- , add other ranges here 
    FROM (
     SELECT COUNT(*) n 
     FROM submissions s JOIN events e 
      ON s.event_id = e.id JOIN users u 
      ON e.user_id = u.id 
     WHERE u.created_at IS NOT NULL 
     GROUP BY e.id 
) q 

サンプル出力

 
+-------+---------+ 
| 0-100 | 101-200 | 
+-------+---------+ 
|  2 |  3 | 
+-------+---------+ 
1 row in set (0.01 sec) 

するのではなく、あなたが

SELECT CONCAT(r.min, '-', r.max) `range`, 
     SUM(n BETWEEN r.min AND r.max) count 
    FROM (
     SELECT COUNT(*) n 
     FROM submissions s JOIN events e 
      ON s.event_id = e.id JOIN users u 
      ON e.user_id = u.id 
     WHERE u.created_at IS NOT NULL 
     GROUP BY e.id 
) q CROSS JOIN (
     SELECT 0 min, 100 max 
     UNION ALL 
     SELECT 101, 200 
     -- add other ranges here 
) r 
GROUP BY r.min, r.max 

サンプル出力を行うことができますセットとしてそれを持っていたい場合

 
+---------+-------+ 
| range | count | 
+---------+-------+ 
| 0-100 |  2 | 
| 101-200 |  3 | 
+---------+-------+ 
2 rows in set (0.01 sec) 
関連する問題