2013-03-08 15 views
13

ho bisogno di fare quanto segue trasporre in MS SQLSQL trasposizione tavolo pieno

da:

Day A B 
--------- 
Mon 1 2 
Tue 3 4 
Wed 5 6 
Thu 7 8 
Fri 9 0 

Al seguente:

Value Mon Tue Wed Thu Fri 
-------------------------- 
A  1 3 5 7 9 
B  2 4 6 8 0 

capisco come si fa con PIVOT quando c'è solo una colonna (A) ma non riesco a capire come farlo quando ci sono più colonne da trasporre (A, B, ...)

il codice di esempio da recepire:

select LEFT(datename(dw,datetime),3) as DateWeek, 
    sum(ACalls) as A, 
    Sum(BCalls) as B 
from DataTable 
group by LEFT(datename(dw,datetime),3) 

Tabella Struttura:

Column DataType 
DateTime Datetime 
ACalls int 
BCalls int 

Qualsiasi aiuto sarà molto apprezzato.

+0

Possibile duplicato del [Modo semplice per trasporre colonne e righe in SQL?] (Http: // stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql) –

risposta

22

Per trasferire i dati nel risultato desiderato, è necessario utilizzare entrambe le funzioni UNPIVOT e PIVOT.

La funzione UNPIVOT utilizza le colonne A e B e converte i risultati in righe. Quindi si utilizzerà la funzione PIVOT per trasformare i valori day in colonne:

select * 
from 
(
    select day, col, value 
    from yourtable 
    unpivot 
    (
    value 
    for col in (A, B) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for day in (Mon, Tue, Wed, Thu, Fri) 
) piv 

Vedi SQL Fiddle with Demo.

Se si utilizza SQL Server 2008+, è possibile utilizzare CROSS APPLY con VALUES per rimuovere i dati. È codice dovrebbe essere modificato come segue:

select * 
from 
(
    select day, col, value 
    from yourtable 
    cross apply 
    (
    values ('A', A),('B', B) 
) c (col, value) 
) src 
pivot 
(
    max(value) 
    for day in (Mon, Tue, Wed, Thu, Fri) 
) piv 

Vedi SQL Fiddle with Demo.

Modifica # 1, applicando la query corrente nella soluzione di cui sopra che si intende utilizzare qualcosa di simile a questo:

select * 
from 
(
    select LEFT(datename(dw,datetime),3) as DateWeek, 
    col, 
    value 
    from DataTable 
    cross apply 
    (
    values ('A', ACalls), ('B', BCalls) 
) c (col, value) 
) src 
pivot 
(
    sum(value) 
    for dateweek in (Mon, Tue, Wed, Thu, Fri) 
) piv 
+0

Grazie per la risposta rapida. Non riesco a fare la unpivot per la seguente query: selezionare SINISTRA (datename (dw, datetime), 3) come DateWeek, SUM (ACalls) come A, SUM (BCalls) come B dal _online_interval_data group di LEFT (datename (dw , datetime), 3) Unpivot (= sintassi errata vicino alla parola chiave 'Unpivot') – Selrac

+0

Sto usando SQL2008 R2. Stesso problema con Cross apply -> selezionare LEFT (datename (dw, datetime), 3) come DateWeek, SUM (ACalls) come A, SUM (BCalls) come B dai dati group by LEFT (datename (dw, datetime), 3) cross apply (= sintassi errata vicino alla parola chiave 'cross') – Selrac

+0

@ user2148939 Non capisco quel codice che hai postato. Modifica il tuo post originale con la struttura della tabella e quindi il codice che stai utilizzando. – Taryn

Problemi correlati