【问题标题】:Total (SUM) Row whilst using dynamic Pivot使用动态数据透视时的总计 (SUM) 行
【发布时间】:2017-12-30 23:07:47
【问题描述】:

我正在尝试在使用动态枢轴时对每一行进行总计 (SUM)。如图所示。

我已经设法获得了每个字段(站点)的 SUM,我现在需要的是每行(可以包含多个站点)总计 (SUMS) 的列。 (如果可能的话,通过扩展我当前的 tsql)

这是我的工作重点。 drawpersite 是一个包含字段的视图

Name(varchar(50)),Site(varchar(50)), Draw(decimal(19, 4),Trade(varchar(50))

我已将其放入视图中以隐藏获取数据所需的所有联接。 下面的查询大部分是拼凑在一起的,但按预期工作(除了所有站点的总数(行总数)

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT
  @columns += N', p.' + QUOTENAME([SiteName])
FROM (SELECT
    [Site] AS [SiteName]
  FROM [dbo].[drawpersite] AS p
  GROUP BY [Site]) AS x;
SET @sql = N'
SELECT [Name],[Trade], ' + STUFF(@columns, 1, 2, '') + ' FROM (
SELECT [Name],[Trade], [Draw] AS [Quantity], [Site] as [SiteName] 
    FROM [dbo].[drawpersite]) AS j PIVOT (SUM(Quantity) FOR [SiteName] in 
       (' + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')) AS p;';
EXEC sp_executesql @sql

我已经看到了其他问题,但我仍在努力解决。

编辑

这是来自视图 DrawPerSite 的数据,这是一个没有分组的平面列表。它会将每个站点的每个 Draw 显示为一条新记录,如日志。所以每个用户(姓名)可以有多个条目,甚至每个站点有多个。

我正在接受这个并且需要显示每个名称,例如管理员每个站点的总抽奖(金额)。

所以根据上面的数据,通过我当前的数据透视查询,我得到了这个结果集。这是我需要每行总数的结果集。

EDIT2

屏幕截图显示第二个记录未总计。

【问题讨论】:

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


    【解决方案1】:

    我会在下一个级别将网站添加到一起:

    DECLARE
        @columns NVARCHAR(MAX)
        , @columns_outer NVARCHAR(MAX)
        , @sums NVARCHAR(MAX)
        , @sql NVARCHAR(MAX);
    
    SET @columns = N'';
    SET @columns_outer = N'';
    SET @sums = N'';
    
    SELECT @columns += N', p.' + QUOTENAME([SiteName])
    FROM
        (
            SELECT [Site] AS [SiteName]
            FROM [dbo].[drawpersite] AS p
            GROUP BY [Site]
        ) AS x;
    
    SELECT @columns_outer += N', p2.' + QUOTENAME([SiteName])
    FROM
        (
            SELECT [Site] AS [SiteName]
            FROM [dbo].[drawpersite] AS p
            GROUP BY [Site]
        ) AS x;
    
    SELECT @sums += N' + ISNULL(' + QUOTENAME([SiteName]) + ', 0)'
    FROM
        (
            SELECT [Site] AS [SiteName]
            FROM [dbo].[drawpersite] AS p
            GROUP BY [Site]
        ) AS x;
    
    SET @sql = N'
        SELECT [Name], [Trade], ' + STUFF(@columns_outer, 1, 2, '') + ', ' + STUFF(@sums, 1, 3, '') + ' [Total] FROM (
        SELECT [Name], [Trade], ' + STUFF(@columns, 1, 2, '') + ' FROM (
        SELECT [Name],[Trade], [Draw] AS [Quantity], [Site] as [SiteName] 
        FROM [dbo].[drawpersite]) AS j PIVOT (SUM(Quantity) FOR [SiteName] in 
        (' + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')) AS p) AS p2;';
    
    EXEC sp_executesql @sql
    

    【讨论】:

    • 我没有得到这个查询的结果集。我得到的只是“命令成功完成”。我已经用“DrawPerSite”视图中的结果集的更多信息编辑了我的问题
    • 嗯,我真正做的唯一改变是在您的 @sql 变量中添加更多文本。我会尝试打印该变量而不是执行它,然后尝试将打印的结果作为普通的 T-SQL 语句执行。我的声明仍然是SELECT,所以我很难知道您是如何获得该输出的。
    • 啊,这是因为我没有将附加变量设置为''。我已经更新了我的答案。 (我已经对其进行了测试,并且可以正常工作。)
    • 刚刚测试过 - 认为它几乎就在那里。但是,第二个记录没有总计,屏幕截图增加了问题。 (正在编辑 2)
    • 谢谢,@sums 变量需要ISNULL。已更新。
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2017-05-27
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多