sql-server - 计算 2 个日期列
问题描述
所以我有 2 个日期列,开始和结束。我要完成的是每天的库存,这将追溯到 2020 年初,因此我拥有以下字段:
开始日期、当天新增的数量、当天关闭的数量以及前几天的现有打开数量。我派生的基本数据结构是开始日期、结束日期、请求类型(如果开始日期 = 报告日期且结束日期为空,则“新添加”,如果结束日期不为空,则“工作已结束”,如果开始日期为小于报告日期然后“现有打开”。问题是这些取决于报告日期和打开/关闭日期之间的相关性。我需要能够按日期分组并给出每天的计数。我试过这些2 个解决方案并没有像我希望的那样工作,因为它们与我的方案略有不同。(按日期计算多列上的函数(SQL Server)和获取两个不同日期列的计数并按日期分组)。当我冷静下来时,我需要根据当前日期的库存和前一天的现有资料每天进行清点。
我的基本数据结构是这样的,是假数据:
+----+------------+-----------+---+
| ID | StartDate | EndDate | |
+----+------------+-----------+---+
| 1 | 1/1/2020 | NULL | |
| 2 | 12/1/2019 | 1/1/2020 | |
| 3 | 1/1/2020 | 1/3/2020 | |
| 4 | 12/17/2019 | 1/2/2020 | |
+----+------------+-----------+---+
预期结果:
+-------------+---------+-----------------+-----------+--+--+------+
| Report Date | NewAdds | ExistingOpen | Closed | | | |
+-------------+---------+-----------------+-----------+--+--+------+
| 1/1/2020 | 2 | 1 | 1 | | | |
| 1/2/2020 | 0 | 1 | 1 | | | |
| 1/3/2020 | 0 | 1 | 1 | | | |
+-------------+---------+-----------------+-----------+--+--+------+
解决方案
set @report_start = '20200101';
set @report_end = '20200103';
select
d.dt,
count(case when t.start_dt = d.dt then 1 end) as Adds,
count(case when d.dt > t.start_dt and d.dt < t.end_dt as Existing,
count(case when t.end_dt = d.dt then 1 end) as Closed
from T t inner join Dates d on d.dt <= coalesce(t.end_dt, @report_end)
where d.dt between @report_start and @report_end
group by d.dt;
创建一个日期表并加入它。在这一点上计数是相当容易的。
这是一个坏主意,因为您需要计算所有日期。我也不知道空结束日期是什么意思。抱歉,如果这是我在手机上输入时的草率。
推荐阅读
- c++ - 新的 std::map::erase() 签名 C++17
- c# - 如何在纯 C# 中创建队列消息代理
- laravel - 如何在 Laravel Eloquent 中使用一对多关系连接?
- python - 是否可以在数据类中使用 *args?
- java - 从文本中读取文件
- python - Python Selenium 使用字典作为定位器类的一个通用 xpath?
- docker - gitlab CE docker push 到托管在 s3 中的注册表失败,并显示“拒绝:禁止访问”
- angular - Angular 5 - 如何等待异步方法的返回值
- c++ - 将 select() 与基于非文件描述符的输入一起使用
- python - 使用下拉输入动态地将轨迹添加到图形