我有下表:
create table #tbl
(
[type] varchar(20),
[qty] int
)
insert into #tbl values ('Type A', 10)
insert into #tbl values ('Type A', 15)
insert into #tbl values ('Type B', 5)
insert into #tbl values ('Type B', 8)
现在我想显示每个人的总数量'类型':
select
isnull([type], 'Other') as [type],
sum(case
when [type] = 'Type A' then qty
when [type] = 'Type B' then qty
when [type] = 'Type C' then qty
else 0
end) as [total]
from #tbl
where [type] in ('Type A', 'Type B', 'Type C')
group by [type]
它正确地总结了每种类型'。结果如下:
type total
--------------
Type A 25
Type B 13
但我希望Type C也包含在结果中(总数量为0)。
type total
--------------
Type A 25
Type B 13
Type C 0
我怎样才能做到这一点? 我正在使用MS SQL Server 2005。
答案 0 :(得分:4)
问题是表中没有Type C
,因此无法返回。一种方法是创建一个包含所需值的派生表,然后左键加入表:
select d.type,
sum(coalesce(t.qty, 0)) Total
from
(
select 'Type A' type union all
select 'Type B' type union all
select 'Type C' type
) d
left join tbl t
on d.type = t.type
group by d.type;
答案 1 :(得分:0)
您需要一个包含要报告的类型列表的表,并对其进行左连接。如下所示:
create table #tbl
(
[type] varchar(20),
[qty] int
);
insert into #tbl values ('Type A', 10)
insert into #tbl values ('Type A', 15)
insert into #tbl values ('Type B', 5)
insert into #tbl values ('Type B', 8)
create table #types ( [type] varchar(20) );
insert into #types values ('Type A' );
insert into #types values ('Type B' );
insert into #types values ('Type C' );
select t.[type], [Total] = IsNull(t.[total], 0)
from ( select [type] = IsNull(t.[Type], 'Other')
, [total] = sum(tbl.[qty])
from #types t
left
join #tbl tbl ON tbl.[type] = t.type
group
by t.[type]
) as t
;
子查询是将NULL总和转换为零所必需的。
答案 2 :(得分:0)
您也可以通过应用UNPIVOT和PIVOT运算符来获得结果。
SELECT type, qty
FROM(
SELECT COALESCE([Type A], 0) AS [Type A],
COALESCE([Type B], 0) AS [Type B],
COALESCE([Type C], 0) AS [Type C]
FROM (
SELECT [type], [qty]
FROM #tbl
) x
PIVOT (
SUM([qty]) FOR [type] IN([Type A], [Type B], [Type C])
) p
)x
UNPIVOT (
[qty] FOR [type] IN([Type A], [Type B], [Type C])
) u
SQLFiddle上的演示