2017-01-05 2 views
0

많은 수의 행에 N 개의 열을 제공하는 우수한 T-SQL 쿼리를 찾습니다. 그러나 열 수는 각 행마다 동일하지 않습니다.T-SQL N 개의 행을 열로 변환

예를 들어 - 약 1 백만 행의 다음과 같은 주문 테이블이 있습니다.

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

각 주문에는 N 개의 주문 라인이있을 수 있습니다.

내 orderline 테이블에는 약 150 만 개의 행이 있습니다.

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

orderlines의 수는 각 주문 (50 등)를 크게 할 수

 
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. 그리고 그것은 또 다른 옵션은 아마 선회 할 수있는 매우 저조한

 
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 

수행 할 것 -

나는 내가 부속 선택을 사용할 수 있지만 그 부속 선택의 N-수를 필요 같아요. 그러나 내가 보았 듯이 "전통적인"피봇 팅이 아닙니다. 역동적 인 피보팅 일 것입니다.

하지만 어떻게 보이고 실행되는지 확실하지 않습니다.

+1

의 사용 가능한 복제 (HTTP 동적으로 이동해야하는 경우 [SQL 서버 동적 PIVOT 쿼리?] : /를 /stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – iamdave

답변

1

내가 조건부 집계 추천 할 것입니다 : 당신이 테이블에 o라고하지 않는 한 버전이, 일을 기대하지 않을 것이다

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; 

합니다. 적절한 구문은 다음과 같습니다

(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