I have this stored procedure:
USE [Baxe]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CreateTable]
AS
BEGIN
DECLARE @cols AS nvarchar( max) ,
@query AS nvarchar( max);
SET @cols = STUFF(( SELECT DISTINCT ',' + QUOTENAME( bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '');
SET @query = 'SELECT bdate, ' + @cols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p ';
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), bmarke, 120))
from subbuyer
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
PRINT @query;
PRINT @cols;
EXECUTE ( @query );
end
Which gives me this output:
Last row with TOTAL is what I need to add. How can I do this?
Put your query in CTE or temp table and useGROUP BY ROLLUP :
;WITH cte AS (
--your query here
)
SELECT ISNULL(bdate,'TOTAL') bdate,
SUM(Total) Total,
SUM(ACCESSORIES) ACCESSORIES,
SUM(NBB) NBB,
SUM(UNDERWARE) UNDERWARE
FROM cte
GROUP BY ROLLUP (bdate)
Output:
bdate Total ACCESSORIES NBB UNDERWARE
13/04/2016 7000 7000 NULL NULL
14/04/2016 3000 NULL NULL 3000
15/04/2016 3000 NULL NULL 3000
16/04/2016 3000 NULL 3000 NULL
17/04/2016 23000 14000 6000 3000
TOTAL 39000 21000 9000 9000
EDIT#1
Based on sample you provided. You need to add variable with column names with SUM function:
DECLARE @sumcols nvarchar(max)
SET @sumcols = STUFF(( SELECT DISTINCT ', SUM(' + QUOTENAME( bmarke)+') as ' + QUOTENAME(bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '');
And change your dynamic query, so your previous query will be in sub-query:
--Forgot about two quotes around TOTAL
SET @query = 'SELECT ISNULL(bdate,''TOTAL'') bdate, '+@sumcols + ' FROM (
SELECT bdate, ' + @cols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p
) t GROUP BY ROLLUP (bdate)';
Hope this helps.
EDIT#2
To add TOTAL column use:
DECLARE @pluscols nvarchar(max)
SET @pluscols = STUFF(( SELECT DISTINCT '+' + QUOTENAME( bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '') + ' as [TOTAL]';
And change your dynamic query, so your previous query will be in sub-query:
--Forgot about two quotes around TOTAL
SET @query = 'SELECT ISNULL(bdate,''TOTAL'') bdate, '+@sumcols + ', SUM([TOTAL]) as [TOTAL] FROM (
SELECT bdate, ' + @cols + ', ' + @pluscols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p
) t GROUP BY ROLLUP (bdate)';
and this is my producer
use baxe
DECLARE @cols AS nvarchar( max) ,
@query AS nvarchar( max);
SET @cols = STUFF(( SELECT DISTINCT ',' + QUOTENAME( bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '');
SET @query = 'SELECT ISNULL(bdate,''TOTAL'') bdate, '+@cols + ' FROM (SELECT bdate, ' + @cols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p;
) GROUP BY ROLLUP (bdate)';
PRINT (@query )
PRINT (@cols)
EXEC (@query)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.