2012-02-22 17 views
6

tengo tabla con los valores de la siguiente manera -SQL tabla dinámica de servidor resultado no agrupar establecer

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 

He escrito esta consulta para resumir todas las licencias tipos como columnas para cada empleado. Cada empleado debe tener solo una fila.

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; 

Pero esta consulta no me está dando el resultado esperado. Hay más de una fila para cada empleado que no es lo que quiero.

la siguiente tabla se muestran los resultados esperados -

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 | 

por favor ayuda.

+0

¿Podría mostrar el resultado que está obteniendo realmente? –

Respuesta

6

Ni siquiera necesita el grupo en la consulta. Porque lo que hace un pivote es que se "agrupa por" en las otras columnas. La clave de esta solución es la selección interna. Creo que no es un dios idé hacer primero una suma con un grupo y luego aplicar una suma y un grupo de nuevo.

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 

Esto le dará el mismo resultado.

+1

Gracias por responder la pregunta y aclarar todas las dudas. –

+0

Me alegra ayudar. Solo tuve que responder porque hacer algo dos veces nunca es bueno para la actuación. – Arion

+1

Gracias, esto resuelve mi problema. Siento que este problema ocurre cuando tenemos más de una columna de medida en la consulta. –

2

puede intentar lo siguiente. Puede reembolsar su mesa como probé la tabla de temperatura igual que su mesa.

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

Excelente hombre. Me perdí el punto de que tenía que estar agrupado antes de aplicar el pivote. –

Cuestiones relacionadas