我有数据表1
Age
10
21
35
50
还有我的问题
select count(*) as Total, *
from
(
select
case
when age <18 then '0-20'
when age between 20 and 29 then '20-29'
when age between 30 and 39 then '30-39'
when age between 40 and 49 then '40-49'
when age between 50 and 59 then '50-59'
when age between 30 and 39 then '30-39'
when age between 60 and 99 then '60+'
end as age_range
from table1
) t
group by t.age_range
结果呢
Total age_range
1 0-20
1 20-29
1 30-39
1 50-59
我希望如何看到这样的结果(缺少40-49计数0和60以上+计数0)
Total age_range
1 0-20
1 20-29
1 30-39
0 40-49
1 50-59
0 60+
谢谢你的帮助。
2条答案
按热度按时间zaq34kh61#
您可以使用行构造函数枚举范围
values()
,然后把table拿过来left join
,最后聚合:yrwegjxp2#
解决这类问题的关键是要认识到sql查询本身不能真正创建行,它只能返回传递给它的经过筛选/透视/分组的数据子集。而不是使用
CASE
语句,我们需要将其转换为一个基于集合的查询,在该查询中,case选项被表示为表中的行。对于较大的集合,可以使用递归查询来构建选项,也可以构造临时表或表变量来存储行。不过,SQLServer2008引入了表值构造函数,可用于快速创建内联表变量以在查询中使用,PinalDave对此有一个简单的writeup
结果: