2017-08-10 3 views
1

同じカラムを持つ集計関数を使用して2つのピボットカラムを作成したいとします。SQL Serverを使用して同じ列名を持つ2つのピボット列を作成する方法はありますか?

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 

  • あなたが二回同じカラム(複数可)を使用して旋回することができません

    - ピボットした後、ピボット句の最初の部分で述べた列がもはや存在しないが括弧で括られた新しい列名で置き換えられました。

  • 我々は(ItemLookupCodet2サブクエリへjoinした場合、結果セットに二度現れるなど)列を複製を導入することを避けるために、サブクエリにapplyではなくJOINをしなければならない

  • Iサブクエリで

  • Weeks列の名前を変更する機会を取った我々はAPPLYを使用するときに我々は外部参照としてp1使用する必要があります - PIVOTは、既存の結果セット/エイリアスを置き換えるまったく新しい結果セットを生成します。

  • PIVOT節に記載されていないすべての列がPIVOT効果GROUP BY S、my answer to your earlier questionで述べたように - なぜ第二ピボットの間に第1 PIVOT懸念によって生成列ではありませんか? ItemLookupCode,StoreIDおよびDepartmentIDの各組み合わせは、最初にPIVOTのためにユニークであることが既に分かっているため、

+0

あなたはピボットについての詳細を理解するために、任意のチュートリアルページでピボットについての詳細を読むために私を提案することができますか?... –

+0

あなたのコードが正常に動作しています。ありがとう、兄弟 –

関連する問題