是否有可能获得每行所有行的总和。示例获取每行所有行的总和
Rows | TotalCount
1 | 20
2 | 30
3 | 10
4 | 60
现在,我想得到以下结果。
Rows | TotalCount
1 | 120
2 | 120
3 | 120
4 | 120
如果有可能在SQL服务器上请帮忙。
是否有可能获得每行所有行的总和。示例获取每行所有行的总和
Rows | TotalCount
1 | 20
2 | 30
3 | 10
4 | 60
现在,我想得到以下结果。
Rows | TotalCount
1 | 120
2 | 120
3 | 120
4 | 120
如果有可能在SQL服务器上请帮忙。
使用子查询,你做SUM
工作:
select rows, (select sum(TotalCount) from tablename) as TotalCount
from tablename
还是一个cross join
:
select t1.rows, t2.TotalCount
from tablename t1
cross join (select sum(TotalCount) as TotalCount from tablename) t2
你知道吗,如果这些查询是等效的,db做优化?对我来说,第一个看起来像必须为每一行执行子查询,所以第二个应该会更好。 –
好吧,我只是做了测试。 http://www.sqlfiddle.com/#!15/2e2fe/2即使当计划中的步骤是不同的顺序看起来像成本是相同的 –
@JuanCarlosOropeza,因为子查询是不相关的,我想它只执行一次 - 在这两种情况下。 – jarlh
尝试这样,
DECLARE @table TABLE
(
Rows INT,
TotalCount INT
)
INSERT INTO @table
VALUES (1,
20),
(2,
30),
(3,
10),
(4,
60)
DECLARE @total INT=(SELECT Sum(totalcount)
FROM @table)
SELECT rows,
@total AS TotalCount
FROM @table
使用窗口功能:
select t.*, sum(totalcount) over()
from t;
通常,窗口函数将比join
/聚合解决方案更快。这是一个相当简单的情况,所以表现可能基本相同。
执行计划表明,这比jarlh,+1的解决方案略高效。 – InbetweenWeekends
欢迎来到Stack Overflow!你似乎在要求某人为你写一些代码。堆栈溢出是一个问答网站,而不是代码写入服务。请[see here](http://stackoverflow.com/help/how-to-ask)学习如何编写有效的问题。 – Quotidian