【问题标题】:Add a summary row with totals添加包含总计的摘要行
【发布时间】:2013-07-29 20:23:50
【问题描述】:

我知道这听起来很疯狂,可能不应该这样做,但我需要这样的东西 - 我有来自 SELECT [Type], [Total Sales] From Before 的记录

我想在末尾添加一个额外的行以在表的末尾(之后)显示 SUM。这个可以吗?

【问题讨论】:

标签: sql sql-server rollup


【解决方案1】:

您的问题需要更多细节,但说“类型”来自名为 letters 的表,而“sales”来自名为 transactions 的表。您可以使用 UNION ALL。

SELECT 类型,COUNT(sales)“总销售额” 来自字母 按类型分组 联合所有 SELECT 'Total', COUNT(sales) "总销售额" 来自交易

【讨论】:

    【解决方案2】:

    这是您希望在 SQL Server 2008+ 中使用的更强大的分组/汇总语法。指定您正在使用的版本总是有用的,因此我们不必猜测。

    SELECT 
      [Type] = COALESCE([Type], 'Total'), 
      [Total Sales] = SUM([Total Sales])
    FROM dbo.Before
    GROUP BY GROUPING SETS(([Type]),());
    

    克雷格·弗里德曼写信给a great blog post introducing GROUPING SETS

    【讨论】:

    【解决方案3】:

    如果您想在没有聚合函数的情况下显示更多列值,请使用 GROUPING SETS 而不是 ROLLUP

    SELECT
      Type = ISNULL(Type, 'Total'),
      SomeIntColumn = ISNULL(SomeIntColumn, 0),
      TotalSales = SUM(TotalSales)
    FROM atable
    GROUP BY GROUPING SETS ((Type, SomeIntColumn ), ())
    ORDER BY SomeIntColumn --Displays summary row as the first row in query result
    

    【讨论】:

    • 我喜欢这个解决方案。如果您想从两个以上的列中查询和检索结果,那么这是一个很好的解决方案。
    【解决方案4】:

    尝试如下使用union all

    SELECT [Type], [Total Sales] From Before
    union all
    SELECT 'Total', Sum([Total Sales]) From Before
    

    如果您在订购时遇到问题,请按照 i-one 的建议试试这个:

    select [Type], [Total Sales] 
    from (SELECT [Type], [Total Sales], 0 [Key] 
          From Before 
          union all 
          SELECT 'Total', Sum([Total Sales]), 1 From Before) sq 
    order by [Key], Type
    

    【讨论】:

    • 这里的小提示,如果 Type 的值在单词 (U,V,W,etc.) Total 之后按字母顺序排列,那么 Total 行可能不会出现在底行...
    • 我同意@Sparky,这样应该是例如select [Type], [Total Sales] from (SELECT [Type], [Total Sales], 0 [Key] From Before union all SELECT 'Total', Sum([Total Sales]), 1 From Before) sq order by [Key], Type
    • 在不知道 [Type] 的可能值的情况下,Cast() 到 VarChar(5) 不会真正解决它。 i-one 显示了正确的解决方案,添加了一个数字计数器来强制排序...
    • 另一个注意事项:UNION ALL 变体需要两次扫描而不是一次。
    【解决方案5】:

    如果您使用的是 SQL Server 2008 或更高版本,则可以使用ROLLUP() GROUP BY 函数:

    SELECT
      Type = ISNULL(Type, 'Total'),
      TotalSales = SUM(TotalSales)
    FROM atable
    GROUP BY ROLLUP(Type)
    ;
    

    这假定Type 列不能有NULL,因此该查询中的NULL 表示汇总行,即总计行。但是,如果 Type 列可以有自己的 NULL,则对总行的更合适的会计类型将类似于 @Declan_K 的答案,即使用 GROUPING() 函数:

    SELECT
      Type = CASE GROUPING(Type) WHEN 1 THEN 'Total' ELSE Type END,
      TotalSales = SUM(TotalSales)
    FROM atable
    GROUP BY ROLLUP(Type)
    ;
    

    【讨论】:

      【解决方案6】:

      您可以使用ROLLUP 运算符

      SELECT  CASE 
                  WHEN (GROUPING([Type]) = 1) THEN 'Total'
                  ELSE [Type] END AS [TYPE]
              ,SUM([Total Sales]) as Total_Sales
      From    Before
      GROUP BY
              [Type] WITH ROLLUP
      

      【讨论】:

        猜你喜欢
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        相关资源
        最近更新 更多