2013-02-18 105 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 – 2013-02-18 16:25:00

回答

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] 

修订 好吧,既然你需要列一个动态的数字,你需要动态SQL(如NJK说的)。我将以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。干得好,拉马尔;) – Kermit 2013-02-18 16:30:53

+1

@njk谢谢njr! – Lamak 2013-02-18 16:33:21

+0

问题是,表4中有数百种不同类型的产品.. – 2013-02-18 16:35:31