简体   繁体   中英

Row and column total in dynamic pivot in MS SQL Server 2008 my questions is row total and columns total) for all products when add

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM