如果我有一个关于人们年龄的数据表,例如:
Name | Age
--------+-----------
John | 35
Mike | 45
我需要将数据分组并输出到标准表中,例如:
Grouper | Count
---------+-------------
Under 50 | 2
Over 50 | 0
我正在运行与此类似的查询(输入得很快,在现实生活中可能无法正常工作。说明了我正在使用case
语句创建组的情况)
select
case
when Age <= 50 then 'Under 50'
else 'Over 50'
end as 'Grouper',
count(Age) as 'Count'
from
theTable
group by
'Grouper'
我得到了这样的答案,因为表中没有人超过50岁:
Grouper | Count
---------+-------------
Under 50 | 2
即使表中没有找到值,如何强制我的结果将所有值保留在case语句中?我无法插入或修改任何数据或表格,这完全是出于报告目的。
答案 0 :(得分:4)
我将其表达为:
select v.grouper, count(Age) as 'Count'
From (values ('Under 50', 0, 51), ('Over 50', 51, null)) v(grouper, lo, hi) left join
theTable t
on t.age >= v.lo and
(t.age < v.hi or v.hi is null)
Group by grouper;
这会生成类似于临时查询表的表格,其中包含要包含的年龄范围和字符串。从您的角度来看,重要的部分是left join
。这样可以保留所有年龄段。
答案 1 :(得分:2)
使用UNION
,如下所示:
select
'Under 50' as grouper,
sum(case when age <= 50 then 1 end) as count
from theTable
union
select
'Over 50' as grouper,
sum(case when age > 50 then 1 end) as count
from theTable