列内のデータをピボット/回転する必要がありますが、これまでのほとんどの例とは少し異なります。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と日付のみからです。
ありがとうございます。私は、部品番号の文字列のアンダースコアを削除し、#myinputテーブルのエイリアスを作成しなければなりませんでしたが、その後、あなたのクエリはテストデータセットに期待される出力を生成しています。これを私の実際のセットに入れようとしています。 – WendyKinect
確認済み - 実際のデータセットに対してこれを実行しただけで、出力はまったく同じです。もう一度、ありがとう! – WendyKinect