2017-03-01 71 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子句中使用大小寫表達式。

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)