SQL 服务器 - 通过不同的分区求和
SQL SERVER - sum over partition by distinct
rN rD rnc d expectedResult
abc1m 2010-03-31 abc 5.7 5.7 + 1.7 +9.6
abc3m 2010-03-31 abc 5.7 5.7 + 1.7 +9.6
abc1y 2010-03-31 abc 5.7 5.7 + 1.7 +9.6
xfx1m 2010-03-31 xfx 1.7 5.7 + 1.7 +9.6
xfx3m 2010-03-31 xfx 1.7 5.7 + 1.7 +9.6
xfx1y 2010-03-31 xfx 1.7 5.7 + 1.7 +9.6
tnt1m 2010-03-31 tnt 9.6 5.7 + 1.7 +9.6
tnt3m 2010-03-31 tnt 9.6 5.7 + 1.7 +9.6
tnt1y 2010-03-31 tnt 9.6 5.7 + 1.7 +9.6
------------------------------------
abc1m 2010-04-01 abc 2.2 2.2 + 8.9 + 5.5
abc3m 2010-04-01 abc 2.2 2.2 + 8.9 + 5.5
abc1y 2010-04-01 abc 2.2 2.2 + 8.9 + 5.5
xfx1m 2010-04-01 xfx 8.9 2.2 + 8.9 + 5.5
xfx3m 2010-04-01 xfx 8.9 2.2 + 8.9 + 5.5
xfx1y 2010-04-01 xfx 8.9 2.2 + 8.9 + 5.5
tnt1m 2010-04-01 tnt 5.5 2.2 + 8.9 + 5.5
tnt3m 2010-04-01 tnt 5.5 2.2 + 8.9 + 5.5
tnt1y 2010-04-01 tnt 5.5 2.2 + 8.9 + 5.5
预期结果 是特定日期的不同 rnc 的总和
如何实现这一目标。
我想使用类似下面的代码但不起作用。
select *,
sum (d) over (partition by rD, distinct rnc) as expectedResult
from myTable
where ...--some condition
order by ...--order by some columns
使用 SQL Server 2012,谢谢
edit: 关于搁置的问题,怎么说不清楚。如果只看 expectedResult
列是不是很清楚?我应该添加什么才能让它变得更好?
--并且每个 rnc 都有 d。假设每个集合都是示例中给出的形式。 (回答一条评论)
这里我们使用cte将相同的行分组在一起。
这样,我们可以只对 select.
中每个组的第一行求和
;WITH cte
AS
(
SELECT *,
GroupRowIndex = ROW_NUMBER() OVER (PARTITION BY rateDate, rnc, d ORDER BY (SELECT 1))
FROM myTable
)
SELECT *,
expectedResult = SUM(d) OVER (PARTITION BY rateDate)
FROM cte
WHERE GroupRowIndex = 1
AND ...--some condition
ORDER BY ...--order by some columns
由于第一列的最后 2 个字符是可重复的,而且您实际上是在分区中按此求和,请试一试,让我知道这是否是您要求的
create table #TempTable (rn nvarchar(10), rD date, rnc nvarchar(10), d decimal(5,2))
insert into #TempTable (rn, rD, rnc, d)
values
('abc1m','2010-03-31','abc', 5.7),
('abc3m','2010-03-31','abc', 5.7),
('abc1y','2010-03-31','abc', 5.7),
('xfx1m','2010-03-31','xfx', 1.7),
('xfx3m','2010-03-31','xfx', 1.7),
('xfx1y','2010-03-31','xfx', 1.7),
('tnt1m','2010-03-31','tnt', 9.6),
('tnt3m','2010-03-31','tnt', 9.6),
('tnt1y','2010-03-31','tnt', 9.6),
------------------------------------
('abc1m','2010-04-01','abc', 2.2),
('abc3m','2010-04-01','abc', 2.2),
('abc1y','2010-04-01','abc', 2.2),
('xfx1m','2010-04-01','xfx', 8.9),
('xfx3m','2010-04-01','xfx', 8.9),
('xfx1y','2010-04-01','xfx', 8.9),
('tnt1m','2010-04-01','tnt', 5.5),
('tnt3m','2010-04-01','tnt', 5.5),
('tnt1y','2010-04-01','tnt', 5.5)
select rn, rD, rnc, d, SUM(d) over (partition by right(rn,2), rD) as 'Sum'
from #TempTable
order by Rd
如果你不想花哨,那就简单了
- 首先你需要 table 不同的 rD、rnd 和 d 值
- 那么您需要对这些值求和
- 然后将它们加入原来的 table
.
select rN, rD, rnc, d, sub.dsum as expectedResult
from yourtable
join (
select rD, rnd, sum(d) as dsum
from (select distinct rD, rnd, d
from yourtable
) x
group by rD, rnd
) sub on yourtable.rD = sub.rD and yourtable.rnd = sub.rnd
您可以使用交叉应用来应用基于 rD 的不同 rnc 值的总和
SELECT t1.*, ca.expectedResult
FROM myTable t1
CROSS APPLY (
SELECT SUM(d) expectedResult
FROM (SELECT DISTINCT rnc, d
FROM myTable t2
WHERE t2.rd = t1.rd) AS s) ca
rN rD rnc d expectedResult
abc1m 2010-03-31 abc 5.7 5.7 + 1.7 +9.6
abc3m 2010-03-31 abc 5.7 5.7 + 1.7 +9.6
abc1y 2010-03-31 abc 5.7 5.7 + 1.7 +9.6
xfx1m 2010-03-31 xfx 1.7 5.7 + 1.7 +9.6
xfx3m 2010-03-31 xfx 1.7 5.7 + 1.7 +9.6
xfx1y 2010-03-31 xfx 1.7 5.7 + 1.7 +9.6
tnt1m 2010-03-31 tnt 9.6 5.7 + 1.7 +9.6
tnt3m 2010-03-31 tnt 9.6 5.7 + 1.7 +9.6
tnt1y 2010-03-31 tnt 9.6 5.7 + 1.7 +9.6
------------------------------------
abc1m 2010-04-01 abc 2.2 2.2 + 8.9 + 5.5
abc3m 2010-04-01 abc 2.2 2.2 + 8.9 + 5.5
abc1y 2010-04-01 abc 2.2 2.2 + 8.9 + 5.5
xfx1m 2010-04-01 xfx 8.9 2.2 + 8.9 + 5.5
xfx3m 2010-04-01 xfx 8.9 2.2 + 8.9 + 5.5
xfx1y 2010-04-01 xfx 8.9 2.2 + 8.9 + 5.5
tnt1m 2010-04-01 tnt 5.5 2.2 + 8.9 + 5.5
tnt3m 2010-04-01 tnt 5.5 2.2 + 8.9 + 5.5
tnt1y 2010-04-01 tnt 5.5 2.2 + 8.9 + 5.5
预期结果 是特定日期的不同 rnc 的总和 如何实现这一目标。 我想使用类似下面的代码但不起作用。
select *,
sum (d) over (partition by rD, distinct rnc) as expectedResult
from myTable
where ...--some condition
order by ...--order by some columns
使用 SQL Server 2012,谢谢
edit: 关于搁置的问题,怎么说不清楚。如果只看 expectedResult
列是不是很清楚?我应该添加什么才能让它变得更好?
--并且每个 rnc 都有 d。假设每个集合都是示例中给出的形式。 (回答一条评论)
这里我们使用cte将相同的行分组在一起。 这样,我们可以只对 select.
中每个组的第一行求和;WITH cte
AS
(
SELECT *,
GroupRowIndex = ROW_NUMBER() OVER (PARTITION BY rateDate, rnc, d ORDER BY (SELECT 1))
FROM myTable
)
SELECT *,
expectedResult = SUM(d) OVER (PARTITION BY rateDate)
FROM cte
WHERE GroupRowIndex = 1
AND ...--some condition
ORDER BY ...--order by some columns
由于第一列的最后 2 个字符是可重复的,而且您实际上是在分区中按此求和,请试一试,让我知道这是否是您要求的
create table #TempTable (rn nvarchar(10), rD date, rnc nvarchar(10), d decimal(5,2))
insert into #TempTable (rn, rD, rnc, d)
values
('abc1m','2010-03-31','abc', 5.7),
('abc3m','2010-03-31','abc', 5.7),
('abc1y','2010-03-31','abc', 5.7),
('xfx1m','2010-03-31','xfx', 1.7),
('xfx3m','2010-03-31','xfx', 1.7),
('xfx1y','2010-03-31','xfx', 1.7),
('tnt1m','2010-03-31','tnt', 9.6),
('tnt3m','2010-03-31','tnt', 9.6),
('tnt1y','2010-03-31','tnt', 9.6),
------------------------------------
('abc1m','2010-04-01','abc', 2.2),
('abc3m','2010-04-01','abc', 2.2),
('abc1y','2010-04-01','abc', 2.2),
('xfx1m','2010-04-01','xfx', 8.9),
('xfx3m','2010-04-01','xfx', 8.9),
('xfx1y','2010-04-01','xfx', 8.9),
('tnt1m','2010-04-01','tnt', 5.5),
('tnt3m','2010-04-01','tnt', 5.5),
('tnt1y','2010-04-01','tnt', 5.5)
select rn, rD, rnc, d, SUM(d) over (partition by right(rn,2), rD) as 'Sum'
from #TempTable
order by Rd
如果你不想花哨,那就简单了
- 首先你需要 table 不同的 rD、rnd 和 d 值
- 那么您需要对这些值求和
- 然后将它们加入原来的 table
.
select rN, rD, rnc, d, sub.dsum as expectedResult
from yourtable
join (
select rD, rnd, sum(d) as dsum
from (select distinct rD, rnd, d
from yourtable
) x
group by rD, rnd
) sub on yourtable.rD = sub.rD and yourtable.rnd = sub.rnd
您可以使用交叉应用来应用基于 rD 的不同 rnc 值的总和
SELECT t1.*, ca.expectedResult
FROM myTable t1
CROSS APPLY (
SELECT SUM(d) expectedResult
FROM (SELECT DISTINCT rnc, d
FROM myTable t2
WHERE t2.rd = t1.rd) AS s) ca