我的目标是获取客户所服务的财政年度,即使计划的开始和结束日期跨越多个财政年度。如果它们跨越多个会计年度,即使只有 1 天,那么我想看到每个会计年度的一行。我还需要考虑客户有计划开始日期但没有结束日期的情况......在这种情况下,我需要它仅输出开始日期的财政年度。我不确定我的代码是否捕获了所有场景。我也完成了此代码的其他迭代,但我无法获得预期的结果。
SELECT DISTINCT cp.document_id AS Client_ProfileID
,CASE
WHEN (MONTH(pe.ServiceStartDate) >= 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30))
AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceStartDate)
WHEN (MONTH(pe.ServiceStartDate) < 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30))
AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceEndDate) - 1
ELSE YEAR(pe.ServiceEndDate)
END AS fiscal_year
--Removed Joins--
GROUP BY cp.document_id
,CASE
WHEN (MONTH(pe.ServiceStartDate) >= 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30))
AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceStartDate)
WHEN (MONTH(pe.ServiceStartDate) < 7 OR (MONTH(pe.ServiceStartDate) = 6 AND DAY(pe.ServiceStartDate) = 30))
AND (MONTH(pe.ServiceEndDate) >= 7 OR (MONTH(pe.ServiceEndDate) = 6 AND DAY(pe.ServiceEndDate) = 30)) THEN YEAR(pe.ServiceEndDate) - 1
ELSE YEAR(pe.ServiceEndDate)
END
GO
以下是如果客户开始日期为 2022 年 6 月 30 日且结束日期为 2022 年 7 月 1 日时我期望看到的示例输出:
Client_ProfileID | 财政年度 |
---|---|
1 | 2022 |
1 | 2023 |
构建并填充会计年度日历。例如:
CREATE TABLE FiscalYearCalendar (
FiscalYear INT,
StartDate DATE,
EndDate DATE
);
INSERT INTO FiscalYearCalendar (FiscalYear, StartDate, EndDate)
VALUES
(2023, '2022-07-01', '2023-06-30'),
(2024, '2023-07-01', '2024-06-30'),
;
现在一些示例数据来演示如何使用会计日历:
CREATE TABLE ServiceRecords (
document_id INT,
ServiceStartDate DATE,
ServiceEndDate DATE
);
INSERT INTO ServiceRecords (document_id, ServiceStartDate, ServiceEndDate)
VALUES
(1, '2023-01-01', '2023-02-21'),
(2, '2023-02-02', '2023-03-22'),
(3, '2023-03-03', '2023-04-23'),
(4, '2023-06-04', '2023-07-24'),
(5, '2023-07-05', '2023-07-25');
结合服务记录和会计日历,这将允许 1 条服务记录跨越多个会计年度,从而返回多行(请参阅 Client_ProfileID 4):
SELECT
sr.document_id AS Client_ProfileID
, fyc.FiscalYear
FROM ServiceRecords sr
JOIN FiscalYearCalendar fyc ON
(sr.ServiceStartDate <= fyc.EndDate AND sr.ServiceEndDate >= fyc.StartDate)
Client_ProfileID | 财政年度 |
---|---|
1 | 2023 |
2 | 2023 |
3 | 2023 |
4 | 2023 |
4 | 2024 |
5 | 2024 |