2013-03-08 9 views
13

Ich brauche die folgenden transponieren in MS SQLSQL transponieren vollständige Tabelle

aus zu tun:

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

auf die folgenden:

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

Ich verstehe, wie es zu tun mit PIVOT wenn Es gibt nur eine Spalte (A), aber ich kann nicht herausfinden, wie es gemacht wird, wenn mehrere Spalten zu transponieren sind (A, B, ...)

Code

Beispiel werden umgesetzt:

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) 

Tabellenstruktur:

Column DataType 
DateTime Datetime 
ACalls int 
BCalls int 

Jede Hilfe wird sehr geschätzt.

+0

Mögliche Duplikat [Einfache Art und Weise zur Umsetzung der Spalten und Zeilen in Sql?] (Http: // stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql) –

Antwort

22

Um die Daten in das gewünschte Ergebnis zu transponieren, müssen Sie die Funktionen UNPIVOT und PIVOT verwenden.

Die Funktion UNPIVOT übernimmt die Spalten A und B und konvertiert die Ergebnisse in Zeilen. Dann werden Sie die PIVOT Funktion die day Werte in Spalten zu verwandeln:

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 

SQL Fiddle with Demo See. Wenn Sie SQL Server 2008+ verwenden, können Sie CROSS APPLY mit VALUES verwenden, um die Daten zu entfernen. Sie Code würde wie folgt geändert werden:

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 

SQL Fiddle with Demo See.

Edit # 1, Ihre aktuelle Abfrage in die obige Lösung Beantragen Sie etwas Ähnliches wie diese verwenden:

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

Danke für die schnelle Antwort. Ich kann nicht schaffen, das Unpivot für die folgende Abfrage zu tun: Wählen Sie LINKS (Datum (dw, Datetime), 3) als DateWeek, SUM (ACalls) als A, SUM (BCalls) als B von _online_interval_data Gruppe von LEFT (Datum (dw , datetime), 3) Unpivot (= falsche Syntax neben dem Schlüsselwort 'Unpivot') – Selrac

+0

Ich benutze SQL2008 R2. Gleicher Problemfehler mit Cross apply -> left LINKS (Datumsname (dw, datetime), 3) als DateWeek, SUM (ACalls) als A, SUM (BCalls) als B aus Daten group by LEFT (Datumsname (dw, datetime), 3) cross apply (= Falsche Syntax in der Nähe des Schlüsselwortes 'cross') – Selrac

+0

@ user2148939 Ich verstehe den von Ihnen geposteten Code nicht. Bitte bearbeiten Sie Ihren ursprünglichen Post mit Ihrer Tabellenstruktur und dann den Code, den Sie verwenden. – Taryn

Verwandte Themen