ORA-30483错误求助:2022年特定组织库存SQL查询报错
错误原因及解决方案
错误根源
ORA-30483错误的直接原因是窗口函数不能出现在GROUP BY子句中,你在GROUP BY列表里使用了first_value(mmt.transaction_quantity) OVER (...),这不符合Oracle SQL的语法规则。
另外,你的期初库存逻辑存在错误:用first_value取2022年内第一笔交易的数量,这并不是真正的期初库存(2022年1月1日之前的库存余额)。
修正后的SQL
WITH item_transactions AS ( -- 计算2022年每个物料的入库、出库总量 SELECT msi.inventory_item_id, msi.segment1 AS item_code, msi.description AS item_description, msi.primary_uom_code AS uom, NVL(SUM(CASE WHEN mmt.transaction_type_name IN ('Receipt', 'Return to Vendor', 'Miscellaneous Receipt') THEN mmt.transaction_quantity ELSE 0 END), 0) AS receipts, NVL(SUM(CASE WHEN mmt.transaction_type_name IN ('Issue', 'Miscellaneous Issue') THEN mmt.transaction_quantity ELSE 0 END), 0) AS issues FROM mtl_system_items_b msi JOIN mtl_material_transactions mmt ON msi.inventory_item_id = mmt.inventory_item_id JOIN mtl_transaction_types_tl mtt ON mtt.transaction_type_id = mmt.transaction_type_id JOIN mtl_parameters mp ON mp.organization_id = mmt.organization_id WHERE mmt.transaction_date BETWEEN '01-JAN-2022' AND '31-DEC-2022' AND mp.organization_id = 3345 GROUP BY msi.inventory_item_id, msi.segment1, msi.description, msi.primary_uom_code ), opening_balances AS ( -- 计算每个物料2022年的期初库存(2022年1月1日之前的累计余额) SELECT mmt.inventory_item_id, NVL(SUM(CASE WHEN mtt.transaction_type_name IN ('Receipt', 'Return to Vendor', 'Miscellaneous Receipt') THEN mmt.transaction_quantity WHEN mtt.transaction_type_name IN ('Issue', 'Miscellaneous Issue') THEN -mmt.transaction_quantity ELSE 0 END), 0) AS opening_balance FROM mtl_material_transactions mmt JOIN mtl_transaction_types_tl mtt ON mtt.transaction_type_id = mmt.transaction_type_id JOIN mtl_parameters mp ON mp.organization_id = mmt.organization_id WHERE mmt.transaction_date < '01-JAN-2022' AND mp.organization_id = 3345 GROUP BY mmt.inventory_item_id ) -- 合并期初、交易数据,计算期末库存 SELECT it.inventory_item_id, it.item_code, it.item_description, it.uom, NVL(ob.opening_balance, 0) AS opening_balance, it.receipts, it.issues, NVL(ob.opening_balance, 0) + it.receipts - it.issues AS closing_balance FROM item_transactions it LEFT JOIN opening_balances ob ON it.inventory_item_id = ob.inventory_item_id ORDER BY it.item_code;
关键说明
- 用CTE(公共表表达式)拆分逻辑:先单独计算2022年的交易聚合数据,再计算期初库存,最后关联得到完整结果,避免窗口函数和GROUP BY冲突。
- 期初库存通过统计2022年之前的所有交易计算:入库加、出库减,得到2022年1月1日的库存余额。
- 期末库存直接通过
期初 + 入库 - 出库计算,无需使用窗口函数,逻辑更清晰。
内容的提问来源于stack exchange,提问作者user21347944
相关产品推荐
相关产品推荐

