用于按日期计算滚动差异的SQL查询

时间:2014-11-18 07:18:49

标签: sql-server date

我似乎无法解决这个问题。

我正在使用MS SQL Management Studio 2008。

我有一张桌子(实际上有几张),但让我们保持简单。该表包含每个项目(SKU)的每日库存数据。

SKU DataDate               Web_qty
2   2014-11-17 00:00:00    404
2   2014-11-18 00:00:00    373
2   2014-11-19 00:00:00    1350
66  2014-11-17 00:00:00    3624
66  2014-11-18 00:00:00    3576
66  2014-11-19 00:00:00    3570
67  2014-11-17 00:00:00    9353
67  2014-11-18 00:00:00    9297
67  2014-11-19 00:00:00    9250

我只需要选择查询即可返回:

SKU DataDate               Difference
2   2014-11-17 00:00:00    ---
2   2014-11-18 00:00:00    -31
2   2014-11-19 00:00:00    +977
66  2014-11-17 00:00:00    ---
66  2014-11-18 00:00:00    -48
66  2014-11-19 00:00:00    -6
67  2014-11-17 00:00:00    ---
67  2014-11-18 00:00:00    -56
67  2014-11-19 00:00:00    -47

我不需要---部分,我刚刚表明要注意这个事实,因为这是第一个记录无法计算。

我尝试使用派生表,但它有点混乱,我需要使用一个工作示例,以便我能更好地理解它。

如果有人能指出我正确的方向,我相信我能够将其他桌子重新加入(即SKU描述和价格)。

非常感谢每个人的时间

千电子伏

2 个答案:

答案 0 :(得分:1)

试试这个。使用correlated sub-query查找rolling difference

CREATE TABLE #tem
  (SKU      INT,DataDate DATETIME,Web_qty  INT)

INSERT #tem
VALUES( 2,'2014-11-17 00:00:00',404),
       (2,'2014-11-18 00:00:00',373),
       (2,'2014-11-19 00:00:00',1350),
       (66,'2014-11-17 00:00:00',3624),
       (66,'2014-11-18 00:00:00',3576),
       (66,'2014-11-19 00:00:00',3570),
       (67,'2014-11-17 00:00:00',9353),
       (67,'2014-11-18 00:00:00',9297),
       (67,'2014-11-19 00:00:00',9250)

SELECT *,
       Web_qty - (SELECT Web_qty
                  FROM   #tem a
                  WHERE  a.sku = b.SKU
                         AND a.DataDate = Dateadd(dd, -1, b.DataDate)) Roll_diff
FROM   #tem b 

答案 1 :(得分:1)

我知道这是一个旧线程,但是我碰巧遇到了类似的问题,最终我用Window函数解决了它。它可以在SQL 2014中运行,但不能确定是否可以在2008年运行。

它还解决了潜在的非连续数据以及没有更改的行的问题。希望它可以帮助某个人!

CREATE TABLE #tem
(SKU INT,DataDate DATETIME,Web_qty INT)

INSERT #tem
VALUES( 2,'2014-11-17 00:00:00',404),
   (2,'2014-11-18 00:00:00',373),
   (2,'2014-11-19 00:00:00',1350),
   (2,'2014-11-20 00:00:00',1350),
   (2,'2014-11-21 00:00:00',1350),
   (66,'2014-11-17 00:00:00',3624),
   (66,'2014-11-18 00:00:00',3576),
   (66,'2014-11-19 00:00:00',3570),
   (66,'2014-11-20 00:00:00',3590),
   (66,'2014-11-21 00:00:00',3578),
   (67,'2014-11-17 00:00:00',9353),
   (67,'2014-11-18 00:00:00',9297),
   (67,'2014-11-19 00:00:00',9250),
   (67,'2014-11-20 00:00:00',9250),
   (67,'2014-11-21 00:00:00',9240)

;WITH A AS (
SELECT 
  SKU,
  DataDate,
  Web_Qty,
  Web_qty - LAG(Web_qty,1, 0)
    OVER (PARTITION BY SKU ORDER BY DataDate) Roll_diff
FROM #tem b 
)
SELECT
  SKU,
  DataDate ValidFromDate,
  Lead(DataDate, 1, DateFromParts(9999,12,31))  OVER (PARTITION BY SKU ORDER BY DataDate) ValidToDate,
  Web_Qty
FROM A WHERE Roll_diff <> 0