2017-10-07 83 views
1

我需要將行中的數據旋轉/旋轉到列中 - 但與我見過的大多數示例有點不同。SQL Server高級Pivot將行分組爲列

我們有顧客會買東西(想想披薩配料賣家......人們總是會買奶酪,麪糰和醬汁;有些人可能會購買配料,但我們不關心)。

我需要做的是按訂單日期對列數據進行排序。下面是兩個腳本來填補溫度輸入和溫度輸出表,以顯示我想要實現的目標。

SQL Server 2008的

CREATE table #myInput 
    (CustomerID Varchar(10), OrderDate varchar(10), Item varchar(13), ItemColor varchar(20)); 


CREATE table #myOUTPUT 
    (
    CustomerID Varchar(10), 
    OrderDate_1 varchar(10), 
    PartA_1 varchar(20), 
    PartB_1 varchar(20), 
    PartC_1 varchar(20), 
    OrderDate_2 varchar(10), 
    PartA_2 varchar(20), 
    PartB_2 varchar(20), 
    PartC_2 varchar(20), 
    OrderDate_3 varchar(10), 
    PartA_3 varchar(20), 
    PartB_3 varchar(20), 
    PartC_3 varchar(20) 
    ) 
INSERT INTO #myInput 
    (CustomerID, OrderDate, Item, ItemColor) 
VALUES 
('abc','5/1/2001','PartA','Silver'), 
('abc','5/1/2001','PartB','Red'), 
('abc','5/1/2001','PartC','Green'), 
('abc','5/20/2002','PartA','Purple'), 
('abc','5/20/2002','PartB','Yellow'), 
('abc','5/20/2002','PartC','Black'), 
('abc','10/1/2002','PartA','Red'), 
('abc','10/1/2002','PartB','Silver'), 
('abc','10/1/2002','PartC','Blue'), 
('def','4/1/2000','PartA','Green'), 
('def','4/1/2000','PartB','Red'), 
('def','4/1/2000','PartC','White'), 
('jkl','5/1/2001','PartA','Black'), 
('jkl','5/1/2001','PartB','Yellow'), 
('jkl','5/1/2001','PartC','Silver'), 
('jkl','10/10/2001','PartA','Green'), 
('jkl','10/10/2001','PartB','Black'), 
('jkl','10/10/2001','PartC','Silver') 
; 

而結果:

insert into #myOUTPUT 

(客戶ID,OrderDate_1,PartA_1,PartB_1,PartC_1,OrderDate_2,PartA_2,PartB_2,PartC_2,OrderDate_3,PartA_3,PartB_3, PartC_3)

VALUES 
('abc','5/1/2001','Silver','Red','Green','5/20/2002','Purple','Yellow','Black','10/1/2002','Red','Silver','Blue'), 
('def','4/1/2000','Green','Red','White','','','','','','','',''), 
('jkl','5/1/2001','Black','Yellow','Silver','10/10/2001','Green','Black','Silver','','','',''); 

select * from #myInput 
select * from #myOUTPUT 

我們正在尋找17個或更少的訂單。至少在目前的時刻,我們沒有超過一打訂單的任何一個客戶。

我試過了幾個不同的東西 - 樞軸似乎並沒有產生我期待的輸出。我想可能是dense_rank來決定首先需要多少列,然後通過cte插入到光標句柄中?但我無法獲得所需的輸出。請注意,源「日期」字段以varchar形式存儲在數據庫中。此外,沒有訂單號碼 - 所以不公平僅僅來自客戶ID和日期。

回答

1

我會使用條件聚合來解決這個問題。如果我理解正確:

select customer, 
     max(case when seqnum_co = 1 then orderdate end) as orderdate_1, 
     max(case when seqnum_co = 1 and item = 'Part_A' then itemcolor end) as parta_1, 
     max(case when seqnum_co = 1 and item = 'Part_B' then itemcolor end) as partb_1, 
     max(case when seqnum_co = 1 and item = 'Part_C' then itemcolor end) as partc_1, 
     max(case when seqnum_co = 2 then orderdate end) as orderdate_2, 
     max(case when seqnum_co = 2 and item = 'Part_A' then itemcolor end) as parta_2, 
     max(case when seqnum_co = 2 and item = 'Part_B' then itemcolor end) as partb_2, 
     max(case when seqnum_co = 2 and item = 'Part_C' then itemcolor end) as partc_2, 
     . . . 
from (select i.*, 
      dense_rank() over (partition by i.customerid order by orderdate) as seqnum_co 
     from #myinput 
    ) i 
group by customer; 
+0

感謝這似乎工作。我刪除了部件號字符串中的下劃線,並且必須爲#myinput表創建別名,但在此之後,您的查詢正在我的測試數據集上生成期望的輸出。努力把這個放到我的實際集合中。 – WendyKinect

+0

已確認 - 只是將其與實際數據集進行對比,輸出完全符合要求。再一次,謝謝你! – WendyKinect