2017-03-01 74 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)