2017-08-10 116 views
1

我想使用具有相同列的聚合函數製作兩個透視列。如何使用SQL Server創建兩個具有相同列名的透視列?

ItemLookupCode StoreID DepartmentID Weeks  QtySold AsOfWeekOnHand 
---------------------------------------------------------------------------------- 
610759C2000  1001  23    30    0   1.5 
610759C2000  1001  23    31    0   0 
610759C2000  1004  23    30    0   2 
610759C2000  1004  23    31    0   3.5 
610759C2000  1201  23    30   0.6395  1 
610759C2000  1201  23    31   0.6395  2 

我試着用下面的查詢。但這是錯誤的。什麼是正確的方法?

select itemlookupcode, storeid, departmentid,[30],[31] from 
(
    select 
     fr.itemlookupcode, 
     fr.storeid, 
     fr.departmentid, 
     fr.asofweekonhand, 
     fr.weeks, 
     fr.QtySold 
    from 
     #finalresult fr 
) x 
pivot 
(
    sum(QtySold) 
    for weeks in ([30],[31]) 
) p1 
pivot 
(
    sum(asofweekonhand) 
    for weeks in ([30],[31]) 
) p2 

注意

我們可以指定列名作爲

Week30Sold Week31Sold Week30AsOfWeekOnHand Week31AsOfWeekOnHand 
------------------------------------------------------------------------- 

回答

1

我想,這大概做你想要什麼:

declare @t table (ItemLookupCode varchar(20), StoreID int, DepartmentID int, Weeks int, 
        QtySold decimal(10,4), AsOfWeekOnHand decimal(10,4)) 
insert into @t(ItemLookupCode,StoreID,DepartmentID,Weeks,QtySold,AsOfWeekOnHand) values 
('610759C2000',1001,23,30, 0 ,1.5), 
('610759C2000',1001,23,31, 0 , 0 ), 
('610759C2000',1004,23,30, 0 , 2 ), 
('610759C2000',1004,23,31, 0 ,3.5), 
('610759C2000',1201,23,30,0.6395, 1 ), 
('610759C2000',1201,23,31,0.6395, 2 ) 

select 
    * 
from 
    (select ItemLookupCode,StoreID,DepartmentID, 
     CONVERT(varchar(13),Weeks) + 'Qty' as Weeks, 
     QtySold from @t) t1 
    pivot (SUM(QtySold) for Weeks in ([30Qty],[31Qty])) p1 
    cross apply 
    (select CONVERT(varchar(13),Weeks) + 'AsOf' as Weeks,AsOfWeekOnHand 
    from @t t2 
    where t2.ItemLookupCode = p1.ItemLookupCode and 
    t2.DepartmentID = p1.DepartmentID and 
    t2.StoreID = p1.StoreID) t2 
    pivot (SUM(AsOfWeekOnHand) for Weeks in ([30AsOf],[31AsOf])) p2 

結果:

ItemLookupCode  StoreID  DepartmentID 30Qty  31Qty 30AsOf 31AsOf 
-------------------- ----------- ------------ ---------- -------- -------- ------- 
610759C2000   1001  23   0.0000  0.0000 1.5000 0.0000 
610759C2000   1004  23   0.0000  0.0000 2.0000 3.5000 
610759C2000   1201  23   0.6395  0.6395 1.0000 2.0000 

值得注意的是:

  • 使用相同的列(S)兩次不能轉動 - 轉動後,在樞軸條款的第一部分中提到的列不復存在,已被括號內的新列名取代。

  • 我們要做的apply,而不是一個JOIN一個子查詢,以避免引入複製

  • I(例如ItemLookupCode將在結果集中,如果t2join到子查詢中出現兩次)藉此機會在子查詢

  • 當我們使用APPLY我們必須使用p1作爲外部引用重命名Weeks列 - 一個PIVOT會生成一個全新的結果集,用於替換任何現有的結果集/別名。

  • 正如my answer to your earlier question提到的,PIVOT有效GROUP BY S中PIVOT條款中未提及的所有列 - 那麼,爲什麼不在第一PIVOT第二轉動過程中產生關注的列?因爲我們已經知道每個組合ItemLookupCode,StoreIDDepartmentID本身都是唯一的,由於第一個PIVOT

+0

你能否建議我在任何教程頁面閱讀更多關於pivot的知識來了解更多關於數據透視的知識.. –

+0

你的代碼工作正常。謝了,兄弟 –

相關問題