如何在SQL查询中按ID匹配对应财年过滤数据优化刷新速度
需求说明
我的原始SQL查询片段如下:
FROM myTable INNER JOIN distinctTable DT on DT.[ID] = myTable.[ID] WHERE myTable.[Category] = '1520'
当前查询会返回myTable.[FiscalYear]的所有值,我需要在现有WHERE子句基础上,针对distinctTable DT中每一条关联记录,过滤出其对应的财年数据。
数据示例
distinctTable数据(最后一列仅为说明,不在表中)
| ID | Close Date | 对应财年(6月至次年5月) |
|---|---|---|
| A101 | 2022-04-21 | FY22 |
| A101 | 2024-12-10 | FY25 |
注:同一ID对应不同Close Date并非输入错误。
原始查询返回结果(单个成本代码)
| ID | Fiscal Year | Cost Code | Amount |
|---|---|---|---|
| A101 | FY20 | CostCode 1 | 10 |
| A101 | FY21 | CostCode 1 | 20 |
| A101 | FY22 | CostCode 1 | 30 |
| A101 | FY23 | CostCode 1 | 40 |
| A101 | FY24 | CostCode 1 | 50 |
| A101 | FY20 | CostCode 1 | 100 |
| A101 | FY21 | CostCode 1 | 200 |
| A101 | FY22 | CostCode 1 | 300 |
| A101 | FY23 | CostCode 1 | 400 |
| A101 | FY24 | CostCode 1 | 500 |
预期结果
| ID | Fiscal Year | Cost Code | Amount |
|---|---|---|---|
| A101 | FY22 | CostCode 1 | 30 |
| A101 | FY24 | CostCode 1 | 500 |
注:财年周期为6月至次年5月,即2024年6月至2025年5月为FY25。
解决方案
核心思路是根据DT.[Close Date]计算出对应的财年,再与myTable.[FiscalYear]匹配。以下是修改后的查询片段:
FROM myTable INNER JOIN distinctTable DT on DT.[ID] = myTable.[ID] WHERE myTable.[Category] = '1520' AND myTable.[FiscalYear] = 'FY' + CASE WHEN MONTH(DT.[Close Date]) >= 6 THEN CAST(YEAR(DT.[Close Date]) + 1 AS VARCHAR(4)) ELSE CAST(YEAR(DT.[Close Date]) AS VARCHAR(4)) END
逻辑解释
- 财年计算规则:根据Close Date的月份判断:
- 若月份≥6,财年为年份+1,格式化为
FY+年份 - 若月份<6,财年为当前年份,格式化为
FY+年份
- 若月份≥6,财年为年份+1,格式化为
- 匹配过滤:将计算得到的财年与
myTable中的FiscalYear字段进行匹配,只保留对应财年的记录。
内容的提问来源于stack exchange,提问作者David.L
相关产品推荐
相关产品推荐

