2017-01-05 4 views
0

多数の行にN個の列を与えるために優れたT-SQLクエリを探しています。しかし、列の数は各行で同じではありません。T-SQL N個の行を列に変換する

たとえば、次のような約100万行の注文表があります。

 
Order 
OrderID Date  
======== ======== 
1   20160102 
2   20160402 

各注文にN個の注文線を付けることができます。

私の注文表には約150万行があります。

 
OrderLine 
OrderID OrderLine ProductID  Amount 
======== ======== ========== ========== 
1   1   3245   299.00 
2   1   9876   799.00 
2   2   5466   899.00 
2   3   7752   599.00 

Iは、次のようなendresultしたい:

 
OrderID Date  ProductID1 Amount1 ProductID2 Amount2 ProductID3 Amount3  
======== ======== ========== ======= ========== ======= ========== ======= 
1   20160102 3245  299.00  
2   20160402 9876  799.00 5466  899.00 7752  599.00  

注文ラインの数は各注文のために(50のように)大きくすることができます。

私は副問い合わせを使用することができると思いますが、それは、副選択のN-数を必要とする -

とは、非常に悪い

 
SELECT 
OrderID, 
Date, 
(SELECT ProductID FROM ORDERLINE OI JOIN O ON O.OrderID=OI.OrderID WHERE ORDERLINE=1) AS ProductID1, 
(SELECT Amount FROM ORDERLINE OI JOIN O ON O.OrderID=OI.OrderID WHERE ORDERLINE=1) AS Amount1, 
... 
(SELECT ProductID FROM ORDERLINE OI JOIN O ON O.OrderID=OI.OrderID WHERE ORDERLINE=N) AS ProductIDN, 
(SELECT Amount FROM ORDERLINE OI JOIN O ON O.OrderID=OI.OrderID WHERE ORDERLINE=N) AS AmountN 

FROM 
ORDER O 
を実行することになり別のオプションは、おそらく旋回することができます。 しかし、私が見ているように、それは "伝統的な"ピボッティングではなく、ダイナミックピボッティングです。

しかし、私はそれがどのように見え、実行するのかは分かりません。

+1

の可能性のある重複(HTTPダイナミック行く必要がある場合は、[SQL Serverの動的なPIVOTクエリ?]:/を/stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – iamdave

答えて

1

私は条件付きの集約をお勧めします:

SELECT o.OrderID, o.Date, 
     MAX(CASE WHEN ol.orderline = 1 THEN ProductId END) as ProductId1, 
     MAX(CASE WHEN ol.orderline = 1 THEN Amount END) as Amount1, 
     MAX(CASE WHEN ol.orderline = 2 THEN ProductId END) as ProductId2, 
     MAX(CASE WHEN ol.orderline = 2 THEN Amount END) as Amount2, 
     . . . 
FROM ORDER O JOIN 
    ORDERLINE OI 
    ON O.OrderID = OI.OrderID 
GROUP BY o.OrderID, o.Date; 

あなたはoと呼ばれるテーブルを持っていない限り、私は、あなたのバージョンが動作するように期待していません。適切な構文は次のようになります。

(SELECT ProductID FROM ORDERLINE OI WHERE O.OrderID = OI.OrderID AND ORDERLINE = 1) AS ProductID1, 
0

あなたは

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(concat('ProductID',OrderLine))+','+ QuoteName(concat('Amount',OrderLine)) From OrderLine Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [OrderID],[Date],' + @SQL + ' 
From (
     Select A.OrderID 
       ,A.Date 
       ,C.* 
     From [Order] A 
     Join OrderLine B on (A.OrderID=B.OrderID) 
     Cross Apply (Values (concat(''ProductID'',B.OrderLine),cast(B.ProductID as varchar(25))) 
          ,(concat(''Amount'' ,B.OrderLine),cast(B.Amount as varchar(25))) 
        ) C (Item,Value) 

    ) A 
Pivot (max(Value) For [Item] in (' + @SQL + ')) p' 
Exec(@SQL); 

戻り

enter image description here

関連する問題