2013-02-19 2 views
1

Теперь у меня есть запрос, чтобы получить меня;Pivot sql with итоги

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

Пробный сверток, но он не работал –

ответ

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

Удивительная логика и мышление. Встань и поклонись! –

+0

Вы можете сесть за свой верхний план. – Kermit