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 数据透视表未对结果集进行分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 数据透视 + 总和 + 分组依据

SQL Server进阶查询

具有大型数据集的 SQL Server 中的数据透视表

按年份透视 SQL Server 结果

数据的分组与计算

带有计数和总和的 SQL Server 数据透视表