You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:57:39