SQL Server-最近3天的添加/累计

时间:2018-07-25 13:39:28

标签: sql-server

表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天的金额值并获得总和。

2 个答案:

答案 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)