Oracle SQL IF ELSE CALCULATION GIVE ME ',', <select into clause> or FROM expected, got 'THEN'

Oracle SQL IF ELSE CALCULATION GIVE ME ',', <select into clause> or FROM expected, got 'THEN'

我是一名 mySQL 用户,必须拼凑 Oracle 查询但表现不佳...

我收到这些错误:

Unable to resolve symbol 'sa'
unexpected 'value'
',', <select into clause> or FROM expected, got 'THEN'

这是我的查询

SELECT
      sa.STA_AUTO_KEY
     , sa.CREDIT_ACCOUNT_NUMBER
     , sa.INVC_NUMBER
     , sod.ROUTE_CODE
     , inh.INVOICE_DATE
     , sa.SHIP_DATE
     , inh.POST_DATE
     , inh.POST_STATUS
     , sa.TRAN_TYPE
     , sa.NEW_PN as PN
     , stm.DESCRIPTION
     , sa.NEW_SERIAL_NUMBER as SERIAL_NUMBER
     , sa.NEW_UNIT_PRICE as UNIT_PRICE
     , STM.UNIT_FREIGHT_COST
     , sa.NEW_UNIT_COST as UNIT_COST
     , sa.OLD_QTY_OH - sa.NEW_QTY_OH as QTY_INVOICED
     , sa.AMOUNT as GROSS
     , (stm.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST) as COST
     , sod.SOD_AUTO_KEY
     , sa.NEW_CONDITION_CODE as CONDITION_CODE
     , sys.USER_NAME as SALESPERSON_CODE
     , sa.SO_NUMBER
     , cmp.COMPANY_NAME
     , cmp.COMPANY_CODE
     , cnc.CONSIGNMENT_CODE
     , IF sa.NEW_SERIAL_NUMBER IS NULL THEN
            sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH) as GROSS
            sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH) - (STM.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST) as NET
        ELSEIF sa.NEW_SERIAL_NUMBER = 'nsn' THEN
            sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH) as GROSS
            sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH) - (STM.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST) as NET
        ELSEIF sa.NEW_SERIAL_NUMBER = 'NSN' THEN
            sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH) as GROSS
            sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH) - (STM.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST) as NET
        ELSE
         sa.NEW_UNIT_PRICE as GROSS
         sa.NEW_UNIT_PRICE - (STM.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST) as NET
        ENDIF
FROM STOCK_AUDIT sa
    LEFT OUTER JOIN INVC_HEADER inh ON sa.INH_AUTO_KEY = inh.INH_AUTO_KEY
    LEFT OUTER JOIN SO_DETAIL sod ON (sa.SOH_AUTO_KEY = sod.SOH_AUTO_KEY) AND (sa.SOD_AUTO_KEY = sod.SOD_AUTO_KEY)
    LEFT OUTER JOIN STOCK stm ON sa.NEW_STM_AUTO_KEY = stm.STM_AUTO_KEY
    LEFT OUTER JOIN SYS_USERS sys ON sod.SYSUR_AUTO_KEY = sys.SYSUR_AUTO_KEY
    LEFT OUTER JOIN COMPANIES cmp ON inh.CMP_AUTO_KEY = cmp.CMP_AUTO_KEY
    LEFT OUTER JOIN CONSIGNMENT_CODES cnc ON sa.NEW_CNC_AUTO_KEY = cnc.CNC_AUTO_KEY
WHERE inh.POST_DATE >= TO_DATE ('2020-09-01', 'YYYY-MM-DD')
    AND inh.POST_DATE <= TO_DATE ('2020-09-30', 'YYYY-MM-DD')
    AND (sa.TRAN_TYPE = 'Post Invoice' OR sa.TRAN_TYPE = 'Invoice Return')
    AND sod.ROUTE_CODE IN ('M', 'S')

非常感谢任何帮助

IF ... THEN ... ELSE 在 Oracle 中是无效的 SQL 语法(但您可以在 PL/SQL 中使用该语法)。

您想使用 CASEDECODE。像这样:

SELECT
      sa.STA_AUTO_KEY
     , sa.CREDIT_ACCOUNT_NUMBER
     , sa.INVC_NUMBER
     , sod.ROUTE_CODE
     , inh.INVOICE_DATE
     , sa.SHIP_DATE
     , inh.POST_DATE
     , inh.POST_STATUS
     , sa.TRAN_TYPE
     , sa.NEW_PN as PN
     , stm.DESCRIPTION
     , sa.NEW_SERIAL_NUMBER as SERIAL_NUMBER
     , sa.NEW_UNIT_PRICE as UNIT_PRICE
     , STM.UNIT_FREIGHT_COST
     , sa.NEW_UNIT_COST as UNIT_COST
     , sa.OLD_QTY_OH - sa.NEW_QTY_OH as QTY_INVOICED
     , sa.AMOUNT as GROSS
     , (stm.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST) as COST
     , sod.SOD_AUTO_KEY
     , sa.NEW_CONDITION_CODE as CONDITION_CODE
     , sys.USER_NAME as SALESPERSON_CODE
     , sa.SO_NUMBER
     , cmp.COMPANY_NAME
     , cmp.COMPANY_CODE
     , cnc.CONSIGNMENT_CODE
     , CASE
       WHEN sa.NEW_SERIAL_NUMBER IS NULL OR sa.NEW_SERIAL_NUMBER IN ( 'nsn', 'NSN' )
       THEN sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH)
       ELSE sa.NEW_UNIT_PRICE
       END AS gross
     , CASE
       WHEN sa.NEW_SERIAL_NUMBER IS NULL OR sa.NEW_SERIAL_NUMBER IN ( 'nsn', 'NSN' )
       THEN sa.NEW_UNIT_PRICE * (sa.OLD_QTY_OH - sa.NEW_QTY_OH) - (STM.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST)
       ELSE sa.NEW_UNIT_PRICE - (STM.UNIT_FREIGHT_COST + sa.NEW_UNIT_COST)
       END AS net
FROM STOCK_AUDIT sa
    LEFT OUTER JOIN INVC_HEADER inh ON sa.INH_AUTO_KEY = inh.INH_AUTO_KEY
    LEFT OUTER JOIN SO_DETAIL sod ON (sa.SOH_AUTO_KEY = sod.SOH_AUTO_KEY) AND (sa.SOD_AUTO_KEY = sod.SOD_AUTO_KEY)
    LEFT OUTER JOIN STOCK stm ON sa.NEW_STM_AUTO_KEY = stm.STM_AUTO_KEY
    LEFT OUTER JOIN SYS_USERS sys ON sod.SYSUR_AUTO_KEY = sys.SYSUR_AUTO_KEY
    LEFT OUTER JOIN COMPANIES cmp ON inh.CMP_AUTO_KEY = cmp.CMP_AUTO_KEY
    LEFT OUTER JOIN CONSIGNMENT_CODES cnc ON sa.NEW_CNC_AUTO_KEY = cnc.CNC_AUTO_KEY
WHERE   inh.POST_DATE >= DATE '2020-09-01'
    AND inh.POST_DATE <  DATE '2020-10-01'
    AND sa.TRAN_TYPE IN ( 'Post Invoice', 'Invoice Return' )
    AND sod.ROUTE_CODE IN ('M', 'S')

如果您的日期有非午夜时间部分,请不要使用 2020-09-30 作为上限,因为您不会获得 2020-09-30 00:00:012020-09-30 23:59:59 之间的任何数据。而是过滤 < DATE '2020-10-01'.