日期:2014-05-17  浏览次数:20885 次

问个关于case when的简单问题
例如我现在需要对分数段来统计,每10分一个分数段,有表如下

名字 分数
张三 76
李四 75
王五 64

用case when来统计人数的话,结果是

分数 人数
60-69 1
70-79 2

而我需要的效果是

分数 人数
0-9 0
10-19 0
  .
  .
  .
60-69 1
70-79 2
  .
  .
90-99 0



这只是我简化了的例子,实际的是以当前时间为准,每X秒(X=5秒,10秒...)向前推,作为一个时间段来分组统计.

------解决方案--------------------
SQL code

SELECT '0-9' "分数", SUM((CASE WHEN 分数>=0 AND 分数<=9 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '10-19' "分数", SUM((CASE WHEN 分数>=10 AND 分数<=19 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '20-29' "分数", SUM((CASE WHEN 分数>=20 AND 分数<=29 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '30-39' "分数", SUM((CASE WHEN 分数>=30 AND 分数<=39 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '40-49' "分数", SUM((CASE WHEN 分数>=40 AND 分数<=49 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '50-59' "分数", SUM((CASE WHEN 分数>=50 AND 分数<=59 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '60-69' "分数", SUM((CASE WHEN 分数>=60 AND 分数<=69 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '70-79' "分数", SUM((CASE WHEN 分数>=70 AND 分数<=79 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '80-89' "分数", SUM((CASE WHEN 分数>=80 AND 分数<=89 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '90-99' "分数", SUM((CASE WHEN 分数>=90 AND 分数<=99 THEN 1 ELSE 0 END))"人数"
FROM t_name
UNION
SELECT '100' "分数", SUM((CASE WHEN 分数=100 THEN 1 ELSE 0 END))"人数"
FROM t_name

------解决方案--------------------
SQL code

select 
'...到...' 分数,sum(case when 分数>... and 分数<... then 1 else 0 end) 人数 from tb
union all
'...到...' 分数,sum(case when 分数>... and 分数<... then 1 else 0 end) 人数 from tb
union all
...
union all
'...到...' 分数,sum(case when 分数>... and 分数<... then 1 else 0 end) 人数 from tb