嗨Stackoverflow超级明星......
这是我的问题。我有一个存储过程,输出一个非常简单的分组和求和值表。典型的东西......公司名称,公司客户数量,公司业务代表,公司年收入等。
工作正常。
我现在需要的是摘要行。输出的最后一行应该是客户端数量,年收入等的总和。通过点击excel中的autosum按钮,你可以做同样的事情。 (这正是我们现在所做的。)
我的初衷是将所有数据插入存储过程中的临时表中,然后在吐出数据之前在最后插入汇总值。
思考?这种方式太混乱了吗?
谢谢,
答案 0 :(得分:6)
将WITH ROLLUP添加到查询的末尾。这将为每个分组提供摘要行。您可以使用GROUPING(列)函数添加一个额外的列,以确定该行是否为汇总行。
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中,所以它还有几年的生存时间......