2017-11-30 4 views
2

Ich versuche, einen Tisch zu schwenken 3 Spalten zu bekommenSQL Server Entpivotisierung zwei Spalten

meine Beispieltabelle ist wie:

CREATE TABLE tbl1 (A1 int, cA1 int,A2 int, cA2 int,A3 int, cA3 int) 
GO 
INSERT INTO tbl1 VALUES (60,2,30,3,10,5); 
GO 

ich die Abfrage unten bin mit dDie Ergebnisse aus zwei Spalten zu erhalten :

select A, value from tbl1 
unpivot 
(
value 
for A in ([A1], [A2],[A3]) 
) un1; 

Die Ergebnisse sind wie:

A | value 
--+------- 
A1|60 
A2|30 
A3|10 

aber ich möchte hinzufügen, und die zweite Spalte mit und die Ergebnisse wie sein:

A | value1 | value2 
--+--------+-------- 
A1| 60  | 2 
A2| 30  | 3 
A3| 10  | 5 

Jede Hilfe ??

Antwort

3

würde ich APPLY verwenden:

select v.* 
from tbl1 t cross apply 
    (values ('A1', t.A1, t.cA1), 
      ('A2', t.A2, t.cA2), 
      ('A3', t.A3, t.cA3) 
    ) v(A, value1, value2); 

CROSS APPLY implementiert eine seitlichen verbinden. Dies ist viel mächtiger als das bloße Unpivoting von Daten, obwohl das Aufheben von Daten ein einfacher Weg ist, um über laterale Verknüpfungen zu lernen.

+0

Dank !!! Du sparst meinen Tag !!! –

2

Eine weitere Möglichkeit, mit XML:

DECLARE @x xml = (SELECT * FROM tbl1 as t FOR XML AUTO, TYPE) 

;WITH cte AS (
SELECT CAST(t.c.query('local-name(.)') as nvarchar(10)) as [name], 
     t.c.value('.','int') as [value], 
     p.number as [pos] 
FROM [master]..spt_values p 
CROSS APPLY @x.nodes('/t[position()=sql:column("number")]/@*') as t(c) 
WHERE p.[type] = 'p' 
) 

SELECT c.[name] as A, 
     c.[value] as value1, 
     c1.[value] as value2 
FROM cte c 
INNER JOIN cte c1 
    ON c1.[name] = N'c'+c.[name] and c.pos = c1.pos 

Ausgang:

A value1 value2 
A1 60  2 
A2 30  3 
A3 10  5 
+0

interessanter Ansatz für meine Code Bank .. danke !!! –

Verwandte Themen