2016-12-17 7 views
1

Hier ist, wie die Daten wie zur ZeitEinzigartige UNPIVOT SQL

OrderNo, OrderDate, Order_PROD1, Order_Unit1, Order_IP1_Date, Order_PROD2, 
1  12/20/2017 17383   894YU  12/23/2017  49348  

Order_Unit2, Order_IP2_Date ...... Order_PROD30, Order_Unit30, 
489UI   11/12/2015 

so, wie ich will, ist

OrderNo, OrderDate, Order_Prod, Order_Unit, Order_IP_Date 
1   12/20/2017 17383   894YU   12/23/2017 
1   12/20/2017 49348   489UI   11/12/2015  
1   12/20/2017 Order_Prod3* Order_Unit3* Order_IP3_Date*  
1   12/20/2017 Order_Prod4* Order_Unit4* Order_IP4_Date* 


Order_Prod3* = Value of column Order_Prod3 
Order_Prod4* = Value of column Order_Prod4 

Hier verwandeln aussieht, ist die Abfrage i

select Orderid, OrderDate, Order_Prod, Order_unit, Order_IP_Date 
from tbl 
unpivot 
(
    Order_Prod ?????? 
    for Order_Prod in (Order_Prod1, Order_Prod2, Order_Prod3)??? 
) unpiv; 

bisher haben Nicht sicher, wie Sie auf mehreren Spalten entpendeln können.

+0

ein eklatantes Versäumnis auf der angenommen hatte Antworten. Setzen Sie eine schnelle Lösung in der letzten Group By –

Antwort

2

Eine dynamische Version (Hinweis habe ich eine zweite Platte als Illustration)

Declare @YourTable table (OrderNo int,OrderDate date,Order_PROD1 varchar(25),Order_Unit1 varchar(25),Order_IP1_Date date,Order_PROD2 varchar(25),Order_Unit2 varchar(25),Order_IP2_Date date,Order_PROD3 varchar(25),Order_Unit3 varchar(25),Order_IP3_Date date) 
Insert Into @YourTable values 
(1,'2017-12-20','17383','894YU','2017-12-23','9999','AAA-894YU','2017-12-31','a9999','bAAA-894YU','2017-12-28'), 
(2,'2017-12-22','17999','89999','2017-12-27','8888','BBB-894YU','2017-12-29','b8888','bBBB-894YU','2017-12-30') 

Declare @XML xml = (Select *,RN=Row_Number() over (Partition By OrderNo Order By OrderNo) from @YourTable for XML RAW) 

Select OrderNo 
     ,OrderDate 
     ,OrderRow  = Replace(Substring(Item,PatIndex('%[0-9]%',Item),2),'_','') 
     ,Order_Prod = max(case when Item Like 'Order_Prod%' then Value else null end) 
     ,Order_Unit = max(case when Item Like 'Order_Unit%' then Value else null end) 
     ,Order_IP_Date = max(case when Item Like 'Order_IP%' then Value else null end) 
From (
     Select OrderNo = r.value('@OrderNo','int') 
       ,OrderDate = r.value('@OrderDate','date') 
       ,RN  = r.value('@RN','int') 
       ,Item  = attr.value('local-name(.)','varchar(100)') 
       ,Value  = attr.value('.','varchar(max)') 
     From @XML.nodes('/row') as A(r) 
     Cross Apply A.r.nodes('./@*') AS B(attr) 
     Where attr.value('local-name(.)','varchar(100)') not in ('OrderNo','OrderDate','RN') 
    ) A 
Group By OrderNo,OrderDate,RN,Replace(Substring(Item,PatIndex('%[0-9]%',Item),2),'_','') 

Returns

OrderNo OrderDate  OrderRow Order_Prod Order_Unit Order_IP_Date 
1  2017-12-20  1   17383  894YU   2017-12-23 
1  2017-12-20  2   9999  AAA-894YU  2017-12-31 
1  2017-12-20  3   a9999  bAAA-894YU 2017-12-28 
2  2017-12-22  1   17999  89999   2017-12-27 
2  2017-12-22  2   8888  BBB-894YU  2017-12-29 
2  2017-12-22  3   b8888  bBBB-894YU 2017-12-30 
1

Vielleicht hilft hier ein Cross Apply. UnPivot hat eine höhere Leistung, aber Sie haben ein wenig mehr Flexibilität.

Declare @YourTable table (OrderNo int,OrderDate date,Order_PROD1 varchar(25),Order_Unit1 varchar(25),Order_IP1_Date date,Order_PROD2 varchar(25),Order_Unit2 varchar(25),Order_IP2_Date date,Order_PROD3 varchar(25),Order_Unit3 varchar(25),Order_IP3_Date date) 
Insert Into @YourTable values 
(1,'2017-12-20','17383','894YU','2017-12-23','9999','AAA-894YU','2017-12-31','a9999','bAAA-894YU','2017-12-28'), 
(2,'2017-12-22','17999','89999','2017-12-27','8888','BBB-894YU','2017-12-29','b8888','bBBB-894YU','2017-12-30') 

Select A.OrderNo 
     ,A.OrderDate 
     ,B.* 
From @YourTable A 
Cross Apply (Values (1,A.Order_Prod1,A.Order_Unit1,A.Order_IP1_Date) 
        ,(2,A.Order_Prod2,A.Order_Unit2,A.Order_IP2_Date) 
        ,(3,A.Order_Prod3,A.Order_Unit3,A.Order_IP3_Date) 
        -- ... 
        --,(30,A.Order_Prod30,A.Order_Unit30,A.Order_IP30_Date) 
      ) B (OrderRow,Order_Prod,Order_Unit,Order_IP_Date) 

Returns

OrderNo OrderDate  OrderRow Order_Prod Order_Unit Order_IP_Date 
1  2017-12-20  1   17383  894YU   2017-12-23 
1  2017-12-20  2   9999  AAA-894YU  2017-12-31 
1  2017-12-20  3   a9999  bAAA-894YU 2017-12-28 
2  2017-12-22  1   17999  89999   2017-12-27 
2  2017-12-22  2   8888  BBB-894YU  2017-12-29 
2  2017-12-22  3   b8888  bBBB-894YU 2017-12-30