SQL Server:如何显示case语句中的占位符行?

时间:2019-03-15 20:28:19

标签: sql sql-server case

如果我有一个关于人们年龄的数据表,例如:

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语句中?我无法插入或修改任何数据或表格,这完全是出于报告目的。

2 个答案:

答案 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