T-SQL Query with SUM, DATEADD logic



我正在寻找一个可以从值表中计算计算表的查询。 查询必须采用日期值,例如'2017-03-01',但我需要从 2 个月前的记录中获取值,但它必须是具有相同 ID 的记录。在这种情况下,它必须从 2017-03-01 、2017-02-01、2017-01-01 (993、492、312( 中获取值并汇总在一起 (1,797(,并将其存储在 2017-03-01 记录中,如下所示,来自客户 CustomerID = 1001。

|1001 | 2017-02-01 |   492 |             |
|1001 | 2017-03-01 |   993 |             |
|1002 | 2017-01-01 |   838 |        1797 |

这需要对所有记录完成。 当然,某些记录不能回去减去 2 个月,但这些值可以保持为空。 我真的不知道写这个查询。

有一些测试查询来执行一些步骤,例如:

SELECT SUM(Value) FROM TestTable WHERE Date BETWEEN Date AND DATEADD(month, -2, Date);
+------------+------------+-------+-------------+
| CustomerID |    Date    | Value | Calculation |
+------------+------------+-------+-------------+
|       1001 | 2016-08-01 |   123 |             |
|       1001 | 2016-09-01 |   434 |             |
|       1001 | 2016-10-01 |   423 |             |
|       1001 | 2016-11-01 |   235 |             |
|       1001 | 2016-12-01 |   432 |             |
|       1001 | 2017-01-01 |   312 |             |
|       1001 | 2017-02-01 |   492 |             |
|       1001 | 2017-03-01 |   993 |             |
|       1002 | 2017-01-01 |   838 |             |
|       1002 | 2017-02-01 |   234 |             |
|       1002 | 2017-03-01 |   453 |             |
|       1002 | 2017-04-01 |   838 |             |
|       1003 | 2017-01-01 |   746 |             |
|       1003 | 2017-02-01 |   242 |             |
|       1003 | 2017-03-01 |   432 |             |
|       1004 | 2017-01-01 |   431 |             |
|       1004 | 2017-02-01 |   113 |             |
+------------+------------+-------+-------------+

我想要我的表格如下

+------------+------------+-------+-------------+
| CustomerID |    Date    | Value | Calculation |
+------------+------------+-------+-------------+
|       1001 | 2016-08-01 |   123 | NULL        |
|       1001 | 2016-09-01 |   434 | NULL        |
|       1001 | 2016-10-01 |   423 | 980         |
|       1001 | 2016-11-01 |   235 | 1092        |
|       1001 | 2016-12-01 |   432 | 1090        |
|       1001 | 2017-01-01 |   312 | 979         |
|       1001 | 2017-02-01 |   492 | 1236        |
|       1001 | 2017-03-01 |   993 | 1797        |
|       1002 | 2017-01-01 |   838 | NULL        |
|       1002 | 2017-02-01 |   234 | NULL        |
|       1002 | 2017-03-01 |   453 | 1525        |
|       1002 | 2017-04-01 |   838 | 1525        |
|       1003 | 2017-01-01 |   746 | NULL        |
|       1003 | 2017-02-01 |   242 | NULL        |
|       1003 | 2017-03-01 |   432 | 1420        |
|       1004 | 2017-01-01 |   431 | NULL        |
|       1004 | 2017-02-01 |   113 | NULL        |
+------------+------------+-------+-------------+

希望你能帮到我! 😉

--First Create Table
create table Testtable(
CustomerID int,
Date date,
Value int
)

--Insert test values
insert into Testtable VALUES(1001,'2016-08-01',123),
(1001,'2016-09-01',434),
(1001,'2016-10-01',423),
(1001,'2016-11-01',235),
(1001,'2016-12-01',432),
(1001,'2017-01-01',312),
(1001,'2017-02-01',492),
(1001,'2017-03-01',993),
(1002,'2017-01-01',838),
(1002,'2017-02-01',234),
(1002,'2017-03-01',453),
(1002,'2017-04-01',838),
(1003,'2017-01-01',746),
(1003,'2017-02-01',242),
(1003,'2017-03-01',432),
(1004,'2017-01-01',431),
(1004,'2017-02-01',113);
--Select Query
SELECT 
CustomerID,
Date,
Value,
CASE WHEN (SELECT COUNT(*) FROM Testtable T4 WHERE T4.CustomerID = T3.CustomerID AND T4.Date < T3.Date) < 2 THEN NULL
ELSE Calculation END AS Calculation
FROM
(SELECT 
*,
(SELECT SUM(T2.Value) FROM Testtable T2 WHERE T.CustomerID = T2.CustomerID AND T2.Date BETWEEN DATEADD(month,-2,T.Date) AND T.Date) AS Calculation
FROM Testtable T) AS T3

这可能需要一些反复试验才能完全正确,但我会试一试,请尝试以下操作:

SELECT CustomerID
, Date
, Value
, Value + 
(SELECT Value from table_name where CustomerID = x.CustomerID and Date = 
DATEADD(m,-1,x.Date)) +
(SELECT Value from table_name where CustomerID = x.CustomerID and Date = 
DATEADD(m,-2,x.Date)) as Calculation
FROM table_name x

请注意,这仅适用于客户 ID/日期是表中的组合键。

希望这有帮助!

最新更新