簡體   English   中英

MS SQL Server 2008 中動態數據透視表中的行和列總計我的問題是添加時所有產品的行總計和列總計

[英]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

我有這個存儲過程:

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

這給了我這個輸出:

圖片

TOTAL 的最后一行是我需要添加的。 我怎樣才能做到這一點?

將您的查詢放在 CTE 或臨時表中並使用GROUP 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)

輸出:

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

編輯#1

根據您提供的樣本。 您需要使用 SUM 函數添加帶有列名的變量:

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 , '');

並更改您的動態查詢,因此您之前的查詢將在子查詢中:

--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)';

希望這可以幫助。

編輯#2

要添加 TOTAL 列,請使用:

DECLARE @pluscols nvarchar(max)
SET @pluscols = STUFF(( SELECT DISTINCT '+' + QUOTENAME( bmarke)
         FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '') + ' as [TOTAL]';

並更改您的動態查詢,因此您之前的查詢將在子查詢中:

--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)';

我喜歡做這張照片

這是我的制作人

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM