表1
金额
...
GROUP BY
year(sbi.dtmDelivered),
month(sbi.dtmDelivered),
o.strCompanyNodeName,
p.strProductName,
p.strProductType,
o.strSalesRegionNodeGroup,
o.strSalesRegionNodeName,
o.strMasterSalesFirstNameNode,
o.strMasterSalesLastNameNode;
编写一个SQL查询以获取输出
10
20
25
40
50
60
70
80
90
100
110
120
130
所以我想添加最近3天的金额值并获得总和。
答案 0 :(得分:0)
您需要LAG窗口功能。它允许您访问上一行中的一列中的值。格式为LAG([Column],[Row Offset],[Default]),因此本示例将当前行的值添加到后2行的值中,并将值再返回1行。
DECLARE @t TABLE (dt DATE, c INT)
INSERT INTO @t VALUES
('07/11/2018',10),
('07/12/2018',20),
('07/13/2018',25),
('07/14/2018',40),
('07/15/2018',50),
('07/16/2018',60),
('07/17/2018',70),
('07/18/2018',80),
('07/19/2018',90),
('07/20/2018',100),
('07/21/2018',110),
('07/22/2018',120),
('07/23/2018',130)
SELECT dt, c,
c + LAG(c, 2) OVER (ORDER BY dt) + LAG(c, 1) OVER (ORDER BY dt)
FROM @t
ORDER BY dt
返回:
dt c
2018-07-11 10 NULL
2018-07-12 20 NULL
2018-07-13 25 55
2018-07-14 40 85
2018-07-15 50 115
2018-07-16 60 150
2018-07-17 70 180
2018-07-18 80 210
2018-07-19 90 240
2018-07-20 100 270
2018-07-21 110 300
2018-07-22 120 330
2018-07-23 130 360
答案 1 :(得分:0)
由于您尚未回复我的评论,因此我在这里不给您完整的答案。因此,我将为您提供部分答案,以便您自己制定解决方法。
使用SUM
时,您还可以访问OVER
子句。在2012+(我假设您正在使用,因为2008现在实际上已不再受支持,并且之前的任何内容都完全不受支持),您可以访问ROWS BETWEEN
中的OVER
子句。
例如:
WITH N AS (
SELECT *
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) V(N)),
Tally AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1
CROSS JOIN N N2)
SELECT I,
SUM(I) OVER (ORDER BY I
ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING) AS SomeSum
FROM Tally
ORDER BY I;
此示例计算当前行的SUM
,然后计算随后的3行。因此,对于I = 1
,就是SUM(1,2,3,4) = 10
。
这些都可以在文档SUM (Transact-SQL)中找到。 SELECT - OVER Clause (Transact-SQL)