2012-02-22 26 views
6

devo tabella con i valori come segue -Sql Server tabella pivot risultato non raggruppamento impostato

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 

Ho scritto questa query per riassumere tutti lasciano i tipi di colonne per ogni dipendente. Ogni dipendente deve avere solo una riga.

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; 

Ma questa query non mi dà l'output previsto. Ci sono più di una riga per ogni dipendente che non è quello che voglio.

La tabella seguente mostra i risultati attesi -

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 | 

prega di aiuto.

+0

Puoi mostrare l'output che stai ricevendo? –

risposta

6

Non è nemmeno necessario il gruppo per la query. Perché ciò che fa un pivot è che "raggruppa per" sulle altre colonne. La chiave di questa soluzione è la selezione interiore. Penso che non sia un dio idé fare prima una somma con un gruppo e poi applicare di nuovo una somma e un gruppo.

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 

Questo ti porterà lo stesso risultato.

+1

Grazie per aver risposto alla domanda e aver risolto tutti i dubbi. –

+0

Felice di aiutare. Dovevo solo rispondere perché fare qualcosa due volte non è mai dio per la performance. – Arion

+1

Grazie, questo risolve il mio problema. Ritengo che questo problema si verifichi quando nella query sono presenti più colonne di indicatori. –

2

puoi provare come segue. Puoi ripalare il tuo tavolo come ho provato la tabella temporanea come il tuo tavolo.

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

Uomo eccellente. Ho appena perso il punto che doveva essere raggruppato prima di applicare il pivot. –