sql - 动态日期范围内的总和
问题描述
我正在尝试根据每个事件的每月期间汇总总计 - 每月时间窗口基于每个事件的第一次发生。
例如,我有以下三个事件和我试图求和的日期范围:
Catastrophe MonthNumber BeginDate EndDate
Hurricane Barry 1 7/16/2019 8/16/2019
Hurricane Barry 2 8/16/2019 9/13/2019
Hurricane Dorian 1 9/4/2019 9/13/2019
Hurricane Florence 1 9/15/2018 10/15/2018
Hurricane Florence 2 10/15/2018 11/15/2018
Hurricane Florence 3 11/15/2018 12/15/2018
Hurricane Florence 4 12/15/2018 1/15/2019
Hurricane Florence 5 1/15/2019 2/15/2019
Hurricane Florence 6 2/15/2019 3/15/2019
Hurricane Florence 7 3/15/2019 4/15/2019
Hurricane Florence 8 4/15/2019 5/15/2019
Hurricane Florence 9 5/15/2019 6/15/2019
Hurricane Florence 10 6/15/2019 7/15/2019
Hurricane Florence 11 7/15/2019 8/15/2019
Hurricane Florence 12 8/15/2019 9/13/2019
对于飓风巴里,我希望有两个记录:
- 期间 2010 年 7 月 16 日至 2019 年 8 月 15 日
- 期间 2019 年 8 月 16 日至 2019 年 9 月 13 日(将是 9/15,但我在 9/13 提出这个问题)
对于多利安飓风,我们只有一份月度摘要:
- 期间 2019 年 9 月 4 日至 2019 年 9 月 13 日(发布日期)
自从佛罗伦萨飓风于 2018 年 9 月 15 日发生以来——我们现在有 12 个我正在尝试生成的月度摘要。
我认为这个 TSQL 会给我每月的摘要,但是这个查询没有返回任何数据:
SELECT r.Catastrophe,
r.MonthNumber,
SUM ( b.Amount )
FROM TransactionTable AS b
INNER JOIN #CatastropheDateRanges AS r ON r.Catastrophe = b.Catastrophe
WHERE r.BeginDate >= b.TransactionDate
AND r.EndDate < b.TransactionDate
GROUP BY r.Catastrophe,
r.MonthNumber;
以下是我希望结果集的样子:
Catastrophe Month Number Total
Hurricane Barry 1 $300.00
Hurricane Barry 2 $350.00
Hurricane Dorian 1 $700.00
Hurricane Florence 1 $300.00
Hurricane Florence 2 $1,000.00
Hurricane Florence 3 $250.00
Hurricane Florence 4 $350.00
获取数据集的样本数据:
CREATE TABLE #CatastropheDateRanges
(
Catastrophe VARCHAR (60),
MonthNumber INT,
BeginDate DATE,
EndDate DATE
);
INSERT INTO #CatastropheDateRanges
VALUES
('Hurricane Barry', 1, N'2019-07-16', N'2019-08-16'),
('Hurricane Barry', 2, N'2019-08-16', N'2019-09-13'),
('Hurricane Dorian', 1, N'2019-09-04', N'2019-09-13'),
('Hurricane Florence', 1, N'2018-09-15', N'2018-10-15'),
('Hurricane Florence', 2, N'2018-10-15', N'2018-11-15'),
('Hurricane Florence', 3, N'2018-11-15', N'2018-12-15'),
('Hurricane Florence', 4, N'2018-12-15', N'2019-01-15'),
('Hurricane Florence', 5, N'2019-01-15', N'2019-02-15'),
('Hurricane Florence', 6, N'2019-02-15', N'2019-03-15'),
('Hurricane Florence', 7, N'2019-03-15', N'2019-04-15'),
('Hurricane Florence', 8, N'2019-04-15', N'2019-05-15'),
('Hurricane Florence', 9, N'2019-05-15', N'2019-06-15'),
('Hurricane Florence', 10, N'2019-06-15', N'2019-07-15'),
('Hurricane Florence', 11, N'2019-07-15', N'2019-08-15'),
('Hurricane Florence', 12, N'2019-08-15', N'2019-09-13');
SELECT *
FROM #CatastropheDateRanges;
CREATE TABLE #TransactionTable
(
Catastrophe VARCHAR (50),
TransactionDate DATE,
TransactionAmount DECIMAL (19, 4)
);
INSERT INTO #TransactionTable
(
Catastrophe,
TransactionDate,
TransactionAmount
)
VALUES
('Hurricane Barry', '20190716', 100.00),
('Hurricane Barry', '20190720', 150.00),
('Hurricane Barry', '20190725', 50.00),
('Hurricane Barry', '20190825', 350.00),
('Hurricane Dorian', '20190910', 350.00),
('Hurricane Dorian', '20190911', 350.00),
('Hurricane Florence', '20180920', 100.00),
('Hurricane Florence', '20180922', 200.00),
('Hurricane Florence', '20181022', 500.00),
('Hurricane Florence', '20181023', 500.00),
('Hurricane Florence', '20181115', 100.00),
('Hurricane Florence', '20181116', 150.00),
('Hurricane Florence', '20181216', 350.00);
SELECT *
FROM #TransactionTable;
DROP TABLE #TransactionTable;
DROP TABLE #CatastropheDateRanges;
关于如何根据我的#CatastropheDateRanges 表中的开始和结束日期获取这些月度摘要的任何建议?
解决方案
就问题而言,您只需要反转日期比较。
改变:
WHERE r.BeginDate >= b.TransactionDate AND r.EndDate < b.TransactionDate
到:
WHERE r.BeginDate <= b.TransactionDate AND r.EndDate > b.TransactionDate
灾难 | 月数 | (无列名) :----------------- | ----------: | :--------------- 飓风巴里 | 1 | 300.0000 飓风巴里 | 2 | 350.0000 飓风多利安 | 1 | 700.0000 飓风佛罗伦萨 | 1 | 300.0000 飓风佛罗伦萨 | 2 | 1000.0000 飓风佛罗伦萨 | 3 | 250.0000 飓风佛罗伦萨 | 4 | 350.0000
推荐阅读
- bash - 在 bash 脚本中不在子 shell 中运行哈希
- python - 调用 cv2.putText() 时出现“未找到所需参数”错误
- node.js - 尝试获取集合时出现 Firebase 凭据错误
- c - How to ascertain that using the _IONBF macro with the setvbuf function, file operations are slow
- java - 如何安装 tomcat 在 intellij 中使用它。Ubuntu
- c# - XAMARIN ios pagina di login in C# [已解决]
- c# - 在 Visual Studio 2019 中使用 CLR 函数将 Hierarchyid 转换为字符串
- python - 为什么我的回溯算法不起作用并产生带有重复条目的正方形?
- python - Python中路径的字符串格式错误
- java - 同步:引起:org.codehaus.groovy.control.MultipleCompilationErrorsException:同步中的启动失败错误...... androidstudio 3.6.1