【问题标题】:Row and column total in dynamic pivot in MS SQL Server 2008 my questions is row total and columns total) for all products when addMS SQL Server 2008 中动态数据透视中的行和列总计我的问题是添加时所有产品的行总计和列总计)
【发布时间】:2016-10-11 11:10:08
【问题描述】:

我有这个存储过程:

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 的最后一行是我需要添加的。我该怎么做?

【问题讨论】:

  • 你的问题是什么?
  • 关键字:Group by ROLLUP
  • 还有GROUP BY GROUPING SETS

标签: sql sql-server sql-server-2008 tsql pivot


【解决方案1】:

将您的查询放在 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)';

【讨论】:

  • 好的,但是对于 1000 个产品的示例,我需要行总数和列总数
  • 这里是亩产
  • 请把你的问题放到你的问题中。
  • 你可以看到我的产品图片
  • 我在查询的最后部分的答案中添加了几个引号,也许,您遇到了与它们相关的错误。请检查更新的答案/
【解决方案2】:

这是我的制片人

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)

【讨论】:

  • vb.net 2010 中 datagridview 中的行总数和列总数
猜你喜欢
  • 1970-01-01
  • 2013-06-12
  • 2017-05-27
  • 2012-03-24
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多