【问题标题】:Full Date Range完整日期范围
【发布时间】:2021-08-12 03:43:43
【问题描述】:

第一次在这里发帖,如果我搞砸了,很抱歉。 我试图弄清楚给定日期范围的多个产品在一天前使用了多少单位。

如果我有一张这样的桌子:

Product_id Start_date End_date Units
1 07/07/2021 07/09/2021 2
2 07/08/2021 07/10/2021 4
3 07/12/2021 07/12/2021 7

输出应该是这样的:

Date Units
07/07/2021 2
07/08/2021 6
07/09/2021 6
07/10/2021 4
07/11/2021 0
07/12/2021 7

【问题讨论】:

  • 好的。你有什么尝试?
  • 我能够列出日期并对单位进行分组/求和,但仅限于开始日期和结束日期,而不是中间日期。我的示例对此不好,但如果 product_id 2 从 9 日开始,那么我的输出将第 9 显示为 6 个单位,但对于我的示例,我的输出显示 2。
  • 发布你所拥有的,即使它没有产生预期的结果。既然你说你的例子不好,那么也许你应该改变它。
  • @belayer 我的意思是对那个评论不好。对于我的问题,这个例子很好。所以我简化了我的问题,因为最终的结果有点复杂。我当前的查询可能没有意义,所以我没有发布它,因为我不想混淆人们或让人们偏离我实际需要的内容。但是,如果我错了,并且它有帮助,我可以添加它。
  • 我认为您想标记 Oracle 和 SQL,而不是 PL/SQLPL/SQL Developer

标签: oracle plsql


【解决方案1】:

这是一种选择;在代码中读取 cmets。

SQL> with
  2  calendar as
  3    -- all dates between the first START_DATE and the last END_DATE.
  4    -- You need it for outer join with data you have.
  5    (select mindat + level - 1 as datum
  6     from (select min(start_date) mindat,
  7                  max(end_date)   maxdat
  8           from test
  9          )
 10     connect by level <= maxdat - mindat + 1
 11    )
 12  -- final query
 13  select c.datum,
 14         nvl(sum(t.units), 0) units
 15  from calendar c left join test t on c.datum between t.start_date and t.end_date
 16  group by c.datum
 17  order by c.datum;

DATUM           UNITS
---------- ----------
07/07/2021          2
07/08/2021          6
07/09/2021          6
07/10/2021          4
07/11/2021          0
07/12/2021          7

6 rows selected.

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2013-10-29
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多