2013-02-19 124 views
1

現在我有一個查詢,讓我這個;樞軸sql與總數

Transaction Type Product 1 (£) Product 2 (£) Product 3 (£) 


Credit Card 1 739.02 920.70 
Debit Card 3 987.34 170.13 
Cheques/P Orders 7 4068.92 3442.00 
Credit Card - Web 1 474.21 515.07 

但現在我需要最後一行總計。

GRAND TOTAL 12 6269.49 5047.90 

不能看到使用匯總與我的樞軸的SQL?任何想法,我可以用來獲得最後一行?

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

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


SET @Query1 = ' 

;WITH CTE AS 
(

    SELECT PT.[description]  AS [Transaction Type], 
      Sum (P.original_amount) AS [AMOUNT (£) CREDIT], 
      PR.[description]  AS [Product Type] 
    FROM [X].[dbo].[Table1] P 
join [X].[dbo].[Table2] PT on P.PAYMENT_ID=PT.PAYMENT_TYPE_ID 
join [X].[dbo].[Table3] SO on SO.PAYMENT_TYPE_ID=P.PAYMENT_TYPE_ID 
join [X].[dbo].[Table4] OI on OI.ORDER_ID=SO.SITE_ORDER_ID 
join [C].[dbo].Table5] 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(@Query1) 
+0

嘗試彙總,但它沒有工作 – 2013-02-19 14:26:11

回答

4

您可以使用ROLLUP獲得您想要的結果,你只需要改變你的代碼稍微做。

您的代碼將與此類似:

DECLARE @ProductTypes AS NVARCHAR(MAX), 
    @ProductTypesSum AS NVARCHAR(MAX), 
    @Query1 AS NVARCHAR(MAX); 

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

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


SET @Query1 = ' 

;WITH CTE AS 
(
    SELECT PT.[description]  AS [Transaction Type], 
      Sum (P.original_amount) AS [AMOUNT (£) CREDIT], 
      PR.[description]  AS [Product Type] 
    FROM [X].[dbo].[Table1] P 
    join [X].[dbo].[Table2] PT on P.PAYMENT_ID=PT.PAYMENT_TYPE_ID 
    join [X].[dbo].[Table3] SO on SO.PAYMENT_TYPE_ID=P.PAYMENT_TYPE_ID 
    join [X].[dbo].[Table4] OI on OI.ORDER_ID=SO.SITE_ORDER_ID 
    join [C].[dbo].Table5] PR on PR.Product_id=OI.PRODUCT_ID 
    group by PT.DESCRIPTION, PR.DESCRIPTION 
) 
SELECT 
    case 
     when [Transaction Type] is not null 
     then [Transaction Type] 
     else ''Grand Total'' end as [Transaction Type], 
    '[email protected]+' 
FROM CTE AS T 
PIVOT 
(
    SUM([AMOUNT (£) CREDIT]) 
    FOR [Product Type] IN ('[email protected]+') 
) AS PT 
group by [Transaction Type] with rollup' 


EXEC(@Query1) 

SQL Fiddle with Demo與修改後的代碼。

+0

令人敬畏的邏輯和思維。站起來鞠躬! – 2013-02-19 14:59:06

+0

你可以坐下來享受你的熱情。 – Kermit 2013-02-19 16:14:48