Reputation: 841
Now I have a query to get me this ;
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
But now I need this last line with totals.
GRAND TOTAL 12 6269.49 5047.90
Cant see to use rollups with my pivot sql ? Any ideas what I could use to get that last line ?
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 ('+@ProductTypes+')) AS PT
'
EXEC(@Query1)
Upvotes: 1
Views: 419
Reputation: 1
You can dynamically pivot for all the values in a pivot column
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = (SELECT string_agg ( QUOTENAME(PivotColumnName) ,',')
From
(
select distinct(PivotColumnName)
from yourtable
)
)
set @query = N'SELECT * from
(
select value, PivotColumnName
from yourtable
) x
pivot
(
max(value)
for PivotColumnName in (' + @cols + N')
) p '
exec sp_executesql @query;
Upvotes: 0
Reputation: 247690
You can use ROLLUP
to get the result that you want, you will just have to alter your code slight to do it.
Your code will be similar to this:
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],
'+@ProductTypesSum+'
FROM CTE AS T
PIVOT
(
SUM([AMOUNT (£) CREDIT])
FOR [Product Type] IN ('+@ProductTypes+')
) AS PT
group by [Transaction Type] with rollup'
EXEC(@Query1)
See SQL Fiddle with Demo with modified code.
Upvotes: 4