如何改造SQL逻辑以同时展示当前财年及上一财年数据
SQL逻辑改造方案
原逻辑说明
原SQL逻辑根据输入的财年(格式如2023-2024)和月份参数,计算单个财年的年月起止范围:
IF V_MONTH='ALL' THEN V_YEAR_MONTH_FROM := (SUBSTR(V_YEAR, 1, 4) - 1 || '04')::NUMERIC; V_YEAR_MONTH_TO := (SUBSTR(V_YEAR, 6, 4) - 1 || '03')::NUMERIC; ELSE IF V_MONTH IN ('01', '02', '03') THEN V_YEAR_MONTH_FROM := (SUBSTR(V_YEAR, 6, 4) || V_MONTH)::NUMERIC; V_YEAR_MONTH_TO := (SUBSTR(V_YEAR, 6, 4) || V_MONTH)::NUMERIC; ELSE V_YEAR_MONTH_FROM := (SUBSTR(V_YEAR, 1, 4) || V_MONTH)::NUMERIC; V_YEAR_MONTH_TO := (SUBSTR(V_YEAR, 1, 4) || V_MONTH)::NUMERIC; END IF; END IF;
改造后逻辑
调整后可实现输入单个财年时,同时覆盖当前财年及上一财年的对应数据,核心是扩展年月起止范围,包含两个财年的时间段:
-- 先提取财年的两个年份,简化后续计算 curr_fy_first_year := SUBSTR(V_YEAR, 1, 4)::INT; curr_fy_second_year := SUBSTR(V_YEAR, 6, 4)::INT; IF V_MONTH='ALL' THEN -- 上一财年起始(当前财年首年-2 + 04)到当前财年结束(当前财年次年-1 + 03) V_YEAR_MONTH_FROM := (curr_fy_first_year - 2 || '04')::NUMERIC; V_YEAR_MONTH_TO := (curr_fy_second_year - 1 || '03')::NUMERIC; ELSE IF V_MONTH IN ('01', '02', '03') THEN -- 上一财年对应月份(当前财年首年 + 月份)到当前财年对应月份(当前财年次年 + 月份) V_YEAR_MONTH_FROM := (curr_fy_first_year || V_MONTH)::NUMERIC; V_YEAR_MONTH_TO := (curr_fy_second_year || V_MONTH)::NUMERIC; ELSE -- 上一财年对应月份(当前财年首年-1 + 月份)到当前财年对应月份(当前财年首年 + 月份) V_YEAR_MONTH_FROM := (curr_fy_first_year - 1 || V_MONTH)::NUMERIC; V_YEAR_MONTH_TO := (curr_fy_first_year || V_MONTH)::NUMERIC; END IF; END IF;
逻辑验证
以输入财年2023-2024为例:
- 当
V_MONTH='ALL'时,起止年月为202104到202303,覆盖2022-2023财年(2021.04-2022.03)和2023-2024财年(2022.04-2023.03)的全部数据 - 当
V_MONTH='01'时,起止年月为202301到202401,包含2022-2023财年的1月和2023-2024财年的1月数据 - 当
V_MONTH='04'时,起止年月为202204到202304,包含2022-2023财年的4月和2023-2024财年的4月数据
内容的提问来源于stack exchange,提问作者Biswajit kumar singh
相关产品推荐
相关产品推荐

