2016-08-17 8 views
1

Ich habe eine Abfrage, die zwei Tabellen und die Abfrage verknüpft ich aus 2 Tabellen ist:Konvertieren von Spalten in Zeilen aus zwei Tabellen

SELECT A.ID,A.CSTID,B.OCT,B.NOV,B.DEC 
FROM TBL A 
INNER JOIN TBL B ON A.ID = B.NUM 

Ausgabe der obigen Abfrage ist:

ID CSTID OCT NOV DEC 
-------------------------- 
1 1A  20 25 30 

Ich möchte der Ausgang als:

ID CSTID MONTHS VALUE 
------------------------- 
1 1A  OCT  20 
1 1A  NOV  25 
1 1A  DEC  30 

ich die unten Abfrage verwendet, aber ich bin immer Fehler:

SELECT 
    A.ID, A.CSTID, 
    C.MONTHS, 
    C.VALUE 
FROM 
    TBL A 
INNER JOIN 
    TBL B ON A.ID = B.NUM 
UNPIVOT 
    (VALUE FOR MONTHS IN (OCT, NOV, DEC)) C 
+1

was ist der Fehler, den Sie bekommen? – Matt

+0

@Matt Die Spalte 'Id' wurde mehrfach angegeben – peter

Antwort

2

Wickeln Sie das verbundene Ergebnis mit select * from ... um und verwenden Sie die unpivot.

SELECT * FROM (
SELECT A.ID,A.CSTID,B.OCT as october,B.NOV as november, B.DEC 
as december 
FROM TBL A 
INNER JOIN TBL B ON A.ID = B.NUM) T 
UNPIVOT (
     VALUE FOR MONTHS IN (october,november,december) 
     ) C 
+0

meine Antwort hier bewegen vkp schlug mich um 30 Sekunden, netter! Beachten Sie jedoch, dass Sie das verknüpfte Ergebnis zuerst entweder als CTE oder als geschachtelte Auswahl erstellen und dann als nächstes UNPIVOT erstellen sollen. Am Ende steht nur der UNPIVOT-Tabellenalias zur Auswahl in Ihrer Spaltenliste zur Verfügung (z. B. c) – Matt

+0

@vkp Thanks. Es funktionierte. Wie man den vollen Namen für Monate für ex tut: Okt wie Oktober und Nov wie November – peter

+0

die Editierung sehen ... Aliase in der inneren Abfrage verwenden –

0

Verwendung UNPIVOT:

SELECT ID, 
     CSTID, 
     MonthName AS MONTHS, 
     Month AS VALUE 
FROM 
(
    SELECT A.ID, 
      A.CSTID, 
      B.OCT AS OCTOBER, 
      B.NOV AS NOVEMBER, 
      B.DEC AS DECEMBER 
    FROM TBL A 
    INNER JOIN TBL B 
     ON A.ID = B.NUM 
) t1 
UNPIVOT 
(
    Month FOR MonthName IN (OCTOBER, NOVEMBER, DECEMBER) 
) AS t2 

Kommentar:

Das einzige Problem, das ich mit Ihrer ursprünglichen Abfrage sehen ist, dass Sie nicht die in Klammern schließen sich wickeln und geben ihm einen Alias . Wenn meine Lösung für Sie funktioniert, dann werden Sie das wissen.

+0

Ich wusste, dass du da hinkommst, aber vkp hat es schon beantwortet, ich habe auch meine korrekte Antwort entfernt, weil es korrekt war und er hat mich um 28 Sekunden geschlagen. Beachten Sie, dass Sie einfach Wert FOR Months IN sagen können (Okt ..... anstatt die Spalten neu zu aliasieren) – Matt

+0

Wer sagt, dass @vkp es richtig gemacht hat? Er wählt alle Spalten aus, was nicht das ist, was das OP will. –

+0

alle die Spalten sind die einzigen, die nach dem dann pivot sind. * und Ihre Spaltenliste wird äquivalent – Matt

0

Sie haben so etwas zu tun:

SELECT * INTO TBL FROM (
VALUES(1, '1A',1,20,25,30)) as x(ID, CSTID, Num, OCT, NOV, DEC) 

SELECT A.ID, A.CSTID, tt.Month_Name, tt.Month_Value 
FROM TBL as A 
INNER JOIN TBL as B 
ON A.ID = B.NUM 
CROSS APPLY (VALUES 
    (B.OCT, 'OCT'), (B.NOV, 'NOV'), (B.DEC, 'DEC') 
) tt (Month_Value, Month_Name) 
Verwandte Themen