在PeopleSoft Query Manager中按财年核算折旧的技术咨询
我明白你作为会计,没有技术背景,在PeopleSoft Query Manager里做这个折旧报表遇到的麻烦——之前的CASE嵌套SUM报错,核心原因是SQL聚合逻辑的顺序搞反了,而且PeopleSoft Query Manager的界面操作需要对应正确的聚合方式。下面一步步给你讲怎么实现:
为什么之前的代码报错?
你之前的写法是CASE WHEN A.FISCAL_YEAR = 2019 THEN sum( A.DEPR) END,这相当于先按年份筛选再聚合,Oracle会要求把FISCAL_YEAR加到GROUP BY里,但这不是你要的结果(你要的是按业务单元+资产聚合,拆分年份列)。正确的逻辑应该是先聚合再按年份拆分:用SUM包裹CASE,把符合年份条件的折旧金额加总,不符合的算0。
在PeopleSoft Query Manager里的具体操作步骤
因为你不能直接写自定义SQL,所以完全通过界面操作来实现:
基础字段选择
- 打开Query Manager,添加
PS_DEPR_RPT表,选中BUSINESS_UNIT(业务单元)和ASSET_ID(资产ID)作为查询字段。
- 打开Query Manager,添加
添加各财年的折旧计算字段
对每个需要展示的财年(比如2019-2023),添加一个计算字段(Expression):- 点击
Add Expression,在表达式编辑器里输入:SUM(CASE WHEN FISCAL_YEAR = 2019 THEN DEPR ELSE 0 END) - 给这个字段命名(比如
FY2019_DEPR或者“2019年折旧”),点击保存。 - 重复这个操作,依次添加2020到2023年的计算字段,只需要替换表达式里的年份即可。
- 点击
设置GROUP BY规则
- 切换到
Group By选项卡,只勾选BUSINESS_UNIT和ASSET_ID这两个字段,不要勾选FISCAL_YEAR或者任何计算字段——因为我们的计算字段已经是聚合后的结果了。
- 切换到
添加过滤条件
- 切换到
Criteria选项卡,添加两个条件:BOOK = 'CORPORATE'BUSINESS_UNIT = '50226'
- 切换到
设置HAVING过滤(可选)
如果你想过滤掉所有财年折旧都为0的行,可以切换到Having选项卡,添加条件:SUM(DEPR) <> 0或者如果你只想保留某一年有折旧的行,也可以用
FY2019_DEPR <> 0这样的条件。
对应的正确SQL逻辑(供你参考)
虽然你不能直接写,但这个SQL是上面界面操作生成的底层逻辑,帮你理解为什么这样做能解决问题:
SELECT A.BUSINESS_UNIT, A.ASSET_ID, SUM(CASE WHEN A.FISCAL_YEAR = 2019 THEN A.DEPR ELSE 0 END) AS FY2019_DEPR, SUM(CASE WHEN A.FISCAL_YEAR = 2020 THEN A.DEPR ELSE 0 END) AS FY2020_DEPR, SUM(CASE WHEN A.FISCAL_YEAR = 2021 THEN A.DEPR ELSE 0 END) AS FY2021_DEPR, SUM(CASE WHEN A.FISCAL_YEAR = 2022 THEN A.DEPR ELSE 0 END) AS FY2022_DEPR, SUM(CASE WHEN A.FISCAL_YEAR = 2023 THEN A.DEPR ELSE 0 END) AS FY2023_DEPR FROM PS_DEPR_RPT A WHERE A.BOOK = 'CORPORATE' AND A.BUSINESS_UNIT = '50226' GROUP BY A.BUSINESS_UNIT, A.ASSET_ID HAVING SUM(A.DEPR) <> 0
这样操作后,你就能得到按业务单元、资产展示各财年年度折旧金额的报表,和Excel的SUMIFS效果一致,而且不会再出现ORA-00979的报错了。
内容的提问来源于stack exchange,提问作者PSUser1989

