2013-02-18 2 views
0

보고서에 대해이보기를 가져와야합니다. 현재 내가 거의 다이,이SQL에서 데이터 뒤집기

 
Transaction Type Amount (£) Credit Product 1 (£) Product 2 (£) Product 3 (£) 
Credit Card   2489.58    829.86   739.02   920.70 
Debit Card   2314.93    1157.47   987.34   170.13 
Cheques/P Orders 11266.38   3755.46   4068.92   3442.00 
Credit Card - Web 1974.21    984.93   474.21   515.07 
GRAND TOTAL   18045.10   6727.72   6269.49   5047.90

...

 
Transaction Type AMOUNT (£) CREDIT Product Type 
Bank Transfer  653.89    Product type 1 
Card    1323.24    Product type 1 
Cash    4538.12    Product type 1 
Direct Debit  118.80    Product type 1 
Bank Transfer  653.89    Product type 2 
Card    1323.24    Product type 2 
Cash    4538.12    Product type 2 
Direct Debit  118.80    Product type 2

내 쿼리에서 변경하려면 어떻게해야합니까?

SELECT PT.description   AS [Transaction Type], 
     Sum (P.original_amount) AS [AMOUNT (£) CREDIT], 
     PR.[description]  AS [Product Type] 
FROM [X].[dbo].[payment] P 
     JOIN [X].[dbo].[table1] PT 
     ON P.payment_id = PT.payment_type_id 
     JOIN [X].[dbo].[table2] SO 
     ON SO.payment_type_id = P.payment_type_id 
     JOIN [X].[dbo].[table3] OI 
     ON OI.order_id = SO.site_order_id 
     JOIN [X].[dbo].[table4] PR 
     ON PR.product_id = OI.product_id 
GROUP BY PT.description, 
      PR.description 
+0

나는 당신이 실제로 찾고있는 것은 피벗이라고 생각 : http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a -simple-sample.aspx –

답변

2

이 수행해야 당신이 컬럼의 동적 번호가 필요하기 때문에

SELECT PT.[DESCRIPTION] as [Transaction Type], 
     SUM(P.ORIGINAL_AMOUNT) as [AMOUNT (£) CREDIT], 
     SUM(CASE WHEN PR.[Description] = 'Product type 1' 
      THEN P.ORIGINAL_AMOUNT END) [Product 1 (£)], 
     SUM(CASE WHEN PR.[Description] = 'Product type 2' 
      THEN P.ORIGINAL_AMOUNT END) [Product 2 (£)], 
     SUM(CASE WHEN PR.[Description] = 'Product type 3' 
      THEN P.ORIGINAL_AMOUNT END) [Product 3 (£)] 
FROM [X].[dbo].[PAYMENT] P 
join [X].[dbo].[TABLE1] PT on P.PAYMENT_ID=PT.PAYMENT_TYPE_ID 
join [X].[dbo].[TABLE2] SO on SO.PAYMENT_TYPE_ID=P.PAYMENT_TYPE_ID 
join [X].[dbo].[TABLE3] OI on OI.ORDER_ID=SO.SITE_ORDER_ID 
join [X].[dbo].[TABLE4] PR on PR.Product_id=OI.PRODUCT_ID 
GROUP BY PT.[DESCRIPTION] 

음을 업데이트 (njk 말했듯이) 당신은 동적 SQL이 필요합니다. PIVOT으로이 작업을 수행하는 한 가지 방법을 게시 할 예정이지만 SQL Server 2005 이상이 필요합니다.

DECLARE @ProductTypes AS NVARCHAR(MAX), @Query AS NVARCHAR(MAX); 

SELECT @ProductTypes = STUFF((SELECT DISTINCT ',' + QUOTENAME([Description]) 
           FROM [X].[dbo].[TABLE4] 
           FOR XML PATH(''), 
           TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SET @Query = ' 
;WITH CTE AS(
    SELECT PT.[description]  AS [Transaction Type], 
      Sum (P.original_amount) AS [AMOUNT (£) CREDIT], 
      PR.[description]  AS [Product Type] 
    FROM [X].[dbo].[payment] P 
      JOIN [X].[dbo].[table1] PT 
      ON P.payment_id = PT.payment_type_id 
      JOIN [X].[dbo].[table2] SO 
      ON SO.payment_type_id = P.payment_type_id 
      JOIN [X].[dbo].[table3] OI 
      ON OI.order_id = SO.site_order_id 
      JOIN [X].[dbo].[table4] PR 
      ON PR.product_id = OI.product_id 
    GROUP BY PT.[description], 
       PR.[description] 
) 
SELECT * 
FROM CTE AS T 
PIVOT(SUM([AMOUNT (£) CREDIT]) FOR [Product Type] IN ('[email protected]+')) AS PT' 

EXEC(@Query) 
+0

+1. 좋은 직장, Lamar;) – Kermit

+1

@njk 감사합니다 njr! – Lamak

+0

문제는 table4에 수백 가지 유형의 제품이 있다는 것입니다. –