如何将mm/dd/yyyy记录分配给另一个表中的相关会计月

6mzjoqzu  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(260)

注意:此问题适用于sql和oracle,我们没有创建临时表或存储过程的权限。
数据库有两个表。
一个表有一个月结束日期字段和一个标识“会计月”标签的文本字段。
第二个表按日期(mm/dd/yyyy)列出了相关的数字数据。
我们需要检索第二个表数据(求和的数字)分组由相关的“财政月”在表1中找到。
在一个查询或使用cte或更好的解决方案中,如何对表1执行某种查找,以检索表2中的mm/dd/yyy日期应分组的会计月。
表1(会计月结束日期)
2015-05-29-财政月为“2015年5月”
2015-06-30-财政月为“2015年6月”
2015-07-31-会计月为“2015年7月”
表2(mm/dd/yyyy)需要按会计月进行汇总和分组
2015-05-29应在“2015年5月”分组
2015-06-30应分组为“2015年6月”

w3nuxt5m

w3nuxt5m1#

因此,我使用的方法是为特定的会计月创建一系列日期。因为您有每个会计月的最后日期,所以可以将上一个日期作为上一个会计月的结束日期。当然,这是一个硬限制,因为财政月表中的第一个月没有上个月的日期(我使用的是一年中的1月1日)。
然后,当您将它与每日数据连接起来时,可以使用这两个日期来确定数据属于哪个会计月。
要获取上一个会计月的结束日期,我们可以使用 LAG 使用月份对行进行排序的分析函数。其余的查询非常简单。

WITH
    fiscal_end_dates
    AS
        (SELECT TO_DATE ('2015-05-29', 'YYYY-MM-DD') AS last_date FROM DUAL
         UNION ALL
         SELECT TO_DATE ('2015-06-30', 'YYYY-MM-DD') AS last_date FROM DUAL
         UNION ALL
         SELECT TO_DATE ('2015-07-31', 'YYYY-MM-DD') AS last_date FROM DUAL),
    daily_data
    AS
        (SELECT TO_DATE ('2015-05-29', 'YYYY-MM-DD') AS data_date,
                10 AS some_value
         FROM DUAL
         UNION ALL
         SELECT TO_DATE ('2015-05-30', 'YYYY-MM-DD') AS data_date,
                14 AS some_value
         FROM DUAL
         UNION ALL
         SELECT TO_DATE ('2015-06-20', 'YYYY-MM-DD') AS data_date,
                34 AS some_value
         FROM DUAL
         UNION ALL
         SELECT TO_DATE ('2015-07-04', 'YYYY-MM-DD') AS data_date,
                34 AS some_value
         FROM DUAL),
    fiscal_date_range
    AS
        (SELECT last_date,
                NVL (
                    LAG (last_date, 1) OVER (ORDER BY EXTRACT (MONTH FROM last_date)),
                    TO_DATE (EXTRACT (YEAR FROM last_date) || '-01-01', 'YYYY-MM-DD')
                )
                    AS prev_month_fiscal_end_date,
                INITCAP (TO_CHAR (last_date, 'MON')) || EXTRACT (YEAR FROM last_date)
                    AS fiscal_month
         FROM fiscal_end_dates)
SELECT dd.*,
       fdr.fiscal_month
FROM daily_data dd,
     fiscal_date_range fdr
WHERE dd.data_date > fdr.prev_month_fiscal_end_date
      AND dd.data_date <= fdr.last_date;

这就是结果(我冒昧地在daily数据表中添加了几行,只是为了显示查询正在工作)

DATA_DATE   SOME_VALUE  FISCAL_MONTH
5/29/2015   10          May2015
5/30/2015   14          Jun2015
6/20/2015   34          Jun2015
7/4/2015    34          Jul2015

现在需要做的就是使用结果集并执行分组和聚合。

相关问题