详细信息后的SQL摘要行

时间:2009-11-09 16:51:35

标签: sql sql-server

嗨Stackoverflow超级明星......

这是我的问题。我有一个存储过程,输出一个非常简单的分组和求和值表。典型的东西......公司名称,公司客户数量,公司业务代表,公司年收入等。

工作正常。

我现在需要的是摘要行。输出的最后一行应该是客户端数量,年收入等的总和。通过点击excel中的autosum按钮,你可以做同样的事情。 (这正是我们现在所做的。)

我的初衷是将所有数据插入存储过程中的临时表中,然后在吐出数据之前在最后插入汇总值。

思考?这种方式太混乱了吗?

谢谢,

4 个答案:

答案 0 :(得分:6)

将WITH ROLLUP添加到查询的末尾。这将为每个分组提供摘要行。您可以使用GROUPING(列)函数添加一个额外的列,以确定该行是否为汇总行。

MSDN example

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
            ELSE ISNULL(Item, 'UNKNOWN')
       END AS Item,
       CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
            ELSE ISNULL(Color, 'UNKNOWN')
       END AS Color,
       SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH ROLLUP
Item                 Color                QtySum                     
-------------------- -------------------- -------------------------- 
Chair                Blue                 101.00                     
Chair                Red                  210.00                     
Chair                ALL                  311.00                     
Table                Blue                 124.00                     
Table                Red                  223.00                     
Table                ALL                  347.00                     
ALL                  ALL                  658.00                     

答案 1 :(得分:1)

你的临时表建议听起来不错。

您可以让存储过程返回两个单独的结果集,但是当您需要通过ADO.NET或其他任何方式读取数据时,这通常会变得很麻烦。

但你自己对临时表的建议就是我要去的那个。

答案 2 :(得分:1)

WITH    data AS
        (
        SELECT  1 AS id, 1 AS value
        UNION ALL
        SELECT  1 AS id, 2 AS value
        UNION ALL
        SELECT  2 AS id, 5 AS value
        )
SELECT  id, COUNT(*) AS cnt, AVG(VALUE) AS a
FROM    data
GROUP BY id WITH ROLLUP

此查询将在NULL字段中返回一个id的额外行,并在相应字段中进行超级聚合。

答案 3 :(得分:0)

其他答案中提到的ROLLUP非常有用,但遗憾的是COMPUTE已被弃用。

这会在主要结果集之后提供单独的结果集,因此您无需在客户端上分离摘要。

尽管如此,它仍然在SQL Server 2008中,所以它还有几年的生存时间......