2017-10-07 13 views
1

列内のデータをピボット/回転する必要がありますが、これまでのほとんどの例とは少し異なります。SQL Serverの高度なグループ化された行を列にグループ化する

私たちには、ピザの原料の売り手と思われる人がいます。人々はいつもチーズ、生地、ソースを購入します(オプションで、トッピングを購入する人もいますが、気にしません)。

私が行う必要があるのは、この行データを列に並べ替えることです。以下は、私が達成しようとしていることを示すために、一時入力と一時出力テーブルを埋める2つのスクリプトです。

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 

(得意先、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以下の注文を探しています。現時点では、少なくとも1つの顧客に対して1ダース以上の注文はありません。

ピボットは、私が探している出力を生成していないようです。私はおそらくdense_rankを考えていましたが、最初に必要なカラムの数を決定し、cte経由でカーソルハンドルに挿入しますか?しかし、私は必要な出力を正確に得ることができません。ソースの「日付」フィールドは、varcharとしてDBに格納されています。また、注文番号はありません。したがって、不正義は顧客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

関連する問題