【发布时间】:2017-06-07 04:11:22
【问题描述】:
如何将每行的总和乘以第三列中的两行总和?
这里有一个截图来说明:
您可以看到 id 1 的总和为 10,但 id 2 的总和为 10+50 = 60 第三个和是 60+100 = 160 等等。
使用 Cte 对我来说效果很好。我需要没有;with cte 意味着虽然代码我需要总和
示例如下所示
DECLARE @t TABLE(ColumnA INT, ColumnB VARCHAR(50));
INSERT INTO @t
VALUES (10,'1'), (50,'2'), (100,'3'), (5,'4'), (45,'5');
;WITH cte AS
(
SELECT ColumnB, SUM(ColumnA) asum
FROM @t
GROUP BY ColumnB
), cteRanked AS
(
SELECT asum, ColumnB, ROW_NUMBER() OVER(ORDER BY ColumnB) rownum
FROM cte
)
SELECT
(SELECT SUM(asum)
FROM cteRanked c2
WHERE c2.rownum <= c1.rownum) AS ColumnA,
ColumnB
FROM
cteRanked c1;
【问题讨论】:
-
使用 CTE 有什么问题?在 SQL Server 2012+ 中,使用
SUM(...) OVER (ORDER BY ...)可以非常有效地计算运行总数。在以前的版本中,您需要某种形式的相关子查询。 -
@VladimirBaranov 这是一个很长的查询,它是其中的一部分,所以当超过 50000 条记录时,执行查询需要更多时间,
-
那么,您认为使用 CTE 会使您的查询变慢,对吗? CTE 本身不会影响 SQL Server 中的查询性能。您可以手动将查询重写为一组嵌套的 SELECT,但 SQL Server 已经这样做了。它内联 CTE。如果您追求一个简单的运行总计并且您正在使用 SQL Server 2012+,那么有一种非常有效的方法可以做到这一点。在 SQL Server 2008 中,游标可能比子查询更有效。请说明您使用的 SQL Server 版本。
-
CTE 并不是一个神奇的性能杀手。要求一个不使用 CTE 的解决方案,认为它会解决您的性能问题是错误的。
-
因为它是一个冗长的查询,它的一部分意味着该查询的 1/20,如果我使用 cte 或 temp 表,它不会影响查询的其余部分,它只会在那个查询中起作用阻止你说不使用 cte 或临时表。
标签: sql-server sql-server-2008 sql-server-2012