2012-02-22 82 views
6

我有值表如下 -Sql Server中的数据透视表不分组结果集

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 | 

请帮助。

+0

你能显示你实际得到的输出吗? – 2012-02-22 06:30:02

回答

6

你甚至不需要查询中的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 

这会得到相同的结果。

+1

感谢您回答问题并清除所有疑问。 – 2012-02-22 10:37:57

+0

很高兴提供帮助。我只是不得不回答,因为做两次事情从来都不是表演的上帝。 – Arion 2012-02-22 10:40:56

+1

谢谢,这解决了我的问题。当我们在查询中存在多个度量列时,我觉得会发生这个问题。 – 2012-09-14 05:37:17

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; 
+0

优秀的男人。我只是错过了在应用数据透视之前必须进行分组的点。 – 2012-02-22 06:51:05