【问题标题】:Sum of 6 previous rows SQL SERVER 2008前 6 行的总和 SQL SERVER 2008
【发布时间】:2017-12-18 10:15:14
【问题描述】:

我有一个简单的查询:

Select
fiscalweek, 4171
From table

我按财政周的顺序得到结果:

FiscalWeek  4171
1           691
2           746
3           650
4           625
5           788
6           581
7           597
8           772
9           777

我希望在第三列中显示前 6 个会计周的总和,或者对于第 2 周,仅显示第 1 周和第 2 周的总和,

所以输出将是:

FiscalWeek  4171    Sum
1           691     691
2           746     1437
3           650     2087
4           625     2712
5           788     7671
6           581     4081
7           597     3393
8           772     4013
9           777     4140

我曾尝试使用rows unbounded preceeding,但这在 2008 年不可用,有什么建议吗?

【问题讨论】:

标签: sql sql-server sql-server-2008 cumulative-sum


【解决方案1】:

对于这种简单的情况,最简单的方法是使用非等值自表。假设t 是您的桌子,a 是 FiscalWeek:

SQL Fiddle

MS SQL Server 2014 架构设置

create table t ( a int, t int);
insert into t values 
(1,10),
(2,11),
(3,12),
(4,13),
(5,14),
(6,15),
(7,16),
(8,17),
(9,18),
(10,19),
(11,20),
(12,10);

查询 1

select t1.a, t1.t, sum(t2.t)
from t t1
inner join t t2 
  on t2.a between t1.a-6 and t1.a --self non equijoin taking 6 prev.
group by t1.a, t1.t
order by t1.a

Results

|  a |  t |     |
|----|----|-----|
|  1 | 10 |  10 |
|  2 | 11 |  21 |
|  3 | 12 |  33 |
|  4 | 13 |  46 |
|  5 | 14 |  60 |
|  6 | 15 |  75 |
|  7 | 16 |  91 |
|  8 | 17 |  98 |
|  9 | 18 | 105 |
| 10 | 19 | 112 |
| 11 | 20 | 119 |
| 12 | 10 | 115 |

硬的方法,可能对 sql XXI 世纪更友好或不友好​​,是处理 CTE、分区和等级。感兴趣的可以搜索一下。

【讨论】:

  • 从未在 on 子句“在 t1.a-6 和 t1.a 之间的 t2.a 上”看到一个带 between 的连接,这太棒了,非常感谢您
  • 我看到了你们人们不会相信的事情。在猎户座的肩膀上攻击着火的船只。我在 Tannhäuser Gate 附近的黑暗中看到 C 型光束在闪烁。代理子查询。假等值。非第一范式数据库。所有这些瞬间都会消失在时间里,就像雨中的泪水。是时候死了。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2013-09-23
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多