首页 > 解决方案 > 如何将 mm/dd/yyyy 记录分配给在另一个表中找到的关联会计月份

问题描述

注意:这个问题是针对 SQL 和 ORACLE 的,我们没有创建临时表或存储过程的权限。

该数据库有两个表。

一个表有一个 End Dates of Months 字段以及一个标识“Fiscal Month”标签的文本字段。

第二个表有日期(mm/dd/yyyy)与相关的数字数据。

我们需要检索按表一中相关“财政月份”分组的第二个表数据(对数字求和)。

在一个查询中或使用 CTE 或更好的解决方案,如何对表一执行某种查找以检索表二中的 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 应归为“May2015”

2015-06-30 应归入“Jun2015”

标签: sqloracle

解决方案


因此,我使用的方法是为特定会计月份创建一系列日期。由于您有每个会计月的最后日期,因此您可以将前一个日期作为上一个会计月的结束日期。当然,这是一个起始硬限制,因为财政月份表中的第一个月不会有上个月的日期(我使用的是一年中的 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;

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

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

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


推荐阅读