Sql Server 数据透视表未对结果集进行分组
Posted
技术标签:
【中文标题】Sql Server 数据透视表未对结果集进行分组【英文标题】:Sql Server pivot table not grouping result set 【发布时间】:2012-03-12 11:55:47 【问题描述】:我有如下值的表 -
EMP_CODE | LEAVENAME | APP_TYPE | LEAVE_DATE | ACT_DAYS
--------------------------------------------------------
ST006 | CL | P | 2012-01-03 | 1.0
ST006 | CL | P | 2012-01-18 | 1.0
ST006 | SL | P | 2012-01-27 | 1.0
ST002 | CL | P | 2012-01-04 | 1.0
ST002 | CL | P | 2012-01-12 | 1.0
ST002 | SL | P | 2012-01-27 | 1.0
OCO038 | CL | P | 2012-01-27 | 1.0
HO188 | CL | P | 2012-01-09 | 1.0
HO188 | CL | P | 2012-01-30 | 1.0
HO085 | CL | P | 2012-01-19 | 1.0
HO085 | SL | P | 2012-01-23 | 1.0
我编写了这个查询来将所有休假类型汇总为每个员工的列。每个员工只能有一行。
SELECT EMP_CODE,[CL],[LWP],[PL],[SL] FROM LEAVE_DETAIL L
PIVOT (SUM(ACT_DAYS) FOR LEAVENAME IN ([CL],[LWP],[PL],[SL]))
AS PVT ORDER BY EMP_CODE;
但是这个查询没有给我预期的输出。每个员工都有不止一行,这不是我想要的。
下表显示了预期的输出 -
EMP_CODE | CL | SL |
---------|------|-----|
ST006 | 2.0 | 1.0 |
ST002 | 2.0 | 1.0 |
OCO038 | 1.0 | 0.0 |
HO188 | 2.0 | 0.0 |
HO085 | 1.0 | 1.0 |
请帮忙。
【问题讨论】:
你能显示你实际得到的输出吗? 【参考方案1】:您甚至不需要查询中的分组依据。因为枢轴所做的是它在其他列上“分组”。这个解决方案的关键是内部选择。我认为先用 group by 求和,然后再应用 sum 和 group by,这不是一个上帝的想法。
SELECT
EMP_CODE,
[CL],
[LWP],
[PL],
[SL]
FROM
(
SELECT
EMP_CODE,
LEAVENAME,
ACT_DAYS
FROM
@tmp_emp
) L
PIVOT
(
SUM(ACT_DAYS)
FOR LEAVENAME IN ([CL],[LWP],[PL],[SL])
)
AS PVT
ORDER BY EMP_CODE
这将得到相同的结果。
【讨论】:
很高兴为您提供帮助。我只需要回答,因为做某事两次绝不是性能的上帝。 谢谢,这解决了我的问题。我觉得当查询中存在多个度量列时会发生此问题。【参考方案2】:您可以尝试如下。您可以更换您的桌子,因为我测试的临时表与您的桌子相同。
create table #tmp_emp (EMP_CODE varchar(10),LEAVENAME char(2), APP_TYPE char(1),LEAVE_DATE datetime,ACT_DAYS decimal(2,1))
insert into #tmp_emp values ('ST006','CL','P ','2012-01-03','1.0');
insert into #tmp_emp values ('ST006','CL','P ','2012-01-18','1.0');
insert into #tmp_emp values ('ST006','SL','P ','2012-01-27','1.0');
insert into #tmp_emp values ('ST002','CL','P ','2012-01-04','1.0');
insert into #tmp_emp values ('ST002','CL','P ','2012-01-12','1.0');
insert into #tmp_emp values ('ST002','SL','P ','2012-01-27','1.0');
insert into #tmp_emp values ('OCO038','CL','P ','2012-01-27','1.0');
insert into #tmp_emp values ('HO188','CL','P ','2012-01-09','1.0');
insert into #tmp_emp values ('HO188','CL','P ','2012-01-30','1.0');
insert into #tmp_emp values ('HO085','CL','P ','2012-01-19','1.0');
insert into #tmp_emp values ('HO085','SL','P ','2012-01-23','1.0');
SELECT EMP_CODE,[CL],[LWP],[PL],[SL]
FROM
(
select EMP_CODE, LEAVENAME, sum(ACT_DAYS) ACT_DAYS
from #tmp_emp
group by EMP_CODE, LEAVENAME
) L
PIVOT (SUM(ACT_DAYS) FOR LEAVENAME IN ([CL],[LWP],[PL],[SL]))
AS PVT ORDER BY EMP_CODE;
【讨论】:
优秀的人。我只是错过了在应用枢轴之前必须对其进行分组的要点。以上是关于Sql Server 数据透视表未对结果集进行分组的主要内容,如果未能解决你的问题,请参考以下文章