sql - 如何将 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”
解决方案
因此,我使用的方法是为特定会计月份创建一系列日期。由于您有每个会计月的最后日期,因此您可以将前一个日期作为上一个会计月的结束日期。当然,这是一个起始硬限制,因为财政月份表中的第一个月不会有上个月的日期(我使用的是一年中的 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
您现在需要做的就是使用结果集并执行分组和聚合。
推荐阅读
- java - 有没有办法从 MsAccess OLE 对象中提取内容?
- javascript - 将状态定义为类中的变量(或属性)是否正确?
- c# - 使用客户端 ID 和密钥读取 Sharepoint 在线列表项
- python - Python - 如何突出显示字符串中的单词?
- pie-chart - amPieChart 中组合负标签和值的分离
- python - 为什么 Python 的 Numpy zeros 和空函数之间的速度差异会因更大的数组大小而消失?
- python - 尝试不同的方法来做一个条件和输出不是预期的(PYTHON)
- javascript - 将 WooCommerce Mailpoet optin 的结帐设置为 true(也在订单审核刷新后)
- simulation - 生产周期的产品进展
- matplotlib - .plt .plt.got 有什么不同?