2013-09-04 20 views
16

Używam SQL Server 2008 i próbuję rozpakować dane. Oto kod SQL, którego używam,SQL Unpivot multiple columns Data

CREATE TABLE #pvt1 (VendorID int, Sa int, Emp1 int,Sa1 int,Emp2 int) 
GO 
INSERT INTO #pvt1 VALUES (1,2,4,3,9); 

GO 

--Unpivot the table. 
SELECT distinct VendorID,Orders,Orders1 
FROM 
    (SELECT VendorID, Emp1, Sa,Emp2,Sa1 
    FROM #pvt1) p 
UNPIVOT 
    (Orders FOR Emp IN 
     (Emp1,Emp2) 
)AS unpvt 
UNPIVOT 
    (Orders1 FOR Emp1 IN 
     (Sa,Sa1) 
)AS unpvt1; 
GO 

A oto wynik powyższego kodu.

VendorID Orders Orders1 
1   4  2 
1   4  3 
1   9  2 
1   9  3 

Ale ja chcę moje wyjście być sposób wskazany poniżej

VendorID Orders Orders1 
1   4  2 
1   9  3 

Zależność od powyższego kodu jest 2 jest związany z 4, a 3 jest związane z 9.

Jak czy mogę to osiągnąć?

+0

FWIW .. ten Link pomógł mi ... http: // mangalpardeshi .blogspot.com/2009/04/unpivot-multiple-columns.html – Seymour

Odpowiedz

29

Łatwiejszy sposób UNPIVOT danych byłoby użyć CROSS APPLY do UNPIVOT kolumny w parach:

select vendorid, orders, orders1 
from pvt1 
cross apply 
(
    select emp1, sa union all 
    select emp2, sa1 
) c (orders, orders1); 

Zobacz SQL Fiddle with Demo. Można też użyć CROSS APPLY z klauzulą ​​wartości, jeśli nie chcesz używać UNION ALL:

select vendorid, orders, orders1 
from pvt1 
cross apply 
(
    values 
    (emp1, sa), 
    (emp2, sa1) 
) c (orders, orders1); 

Zobacz SQL Fiddle with Demo

+1

wow ... jest to bardzo przydatne, ale nigdy nie zawracałem sobie tym głowy. Muszę wstać, by przyspieszyć CROSS APPLY. –