简体   繁体   中英

How to fix Oracle “not a GROUP BY expression” error with sub-query in where clause

I have the following query that breaks when I add a subquery condition in the where clause. If I place a text value it works, if I remove the subquery condition it works.

The subquery on its own works and returns a single value. I tried making a CTE first, rearranging the query and it always breaks when I add that specific condition.

What could be the reason for getting ORA-00979: not a GROUP BY expression?

SELECT ST.SECURITY_CODE "ID"
    ,SM.PORTFOLIO_CLASS "Main_Type"
    ,ST.MATURITY_DATE "Maturity_Date"
    ,SUM(CASE 
            WHEN ST.CUST_TRANS_CODE = 'SEL'
                THEN TO_NUMBER(ST.BR_NO_NOM) * - 1
            ELSE TO_NUMBER(ST.BR_NO_NOM)
            END) "Balance1"
    ,ST.BR_ACC_NO "Nostro_Account"
    ,ST.CU_ACCOUNT_CCY "Currency_Code"
FROM v_FBNK_SEC_TRADE ST
LEFT  JOIN v_F_SECURITY_MASTER SM ON ST.SECURITY_CODE = SM.SECURITY_CODE
WHERE ST.CUSTOMER_NO = '999999'
    AND ST.BR_NO_NOM IS NOT NULL
    AND TO_NUMBER(ST.BR_NO_NOM) > 0
    AND ST.MATURITY_DATE < (
        SELECT TODAY
        FROM v_F_DATES
        WHERE RECID = 'TT0010001'
        )
GROUP BY ST.SECURITY_CODE
    ,SM.PORTFOLIO_CLASS
    ,ST.MATURITY_DATE
    ,ST.BR_ACC_NO
    ,ST.CU_ACCOUNT_CCY

this will work:

SELECT ST.SECURITY_CODE "ID"
    ,SM.PORTFOLIO_CLASS "Main_Type"
    ,ST.MATURITY_DATE "Maturity_Date"
    ,SUM(CASE 
            WHEN ST.CUST_TRANS_CODE = 'SEL'
                THEN TO_NUMBER(ST.BR_NO_NOM) * - 1
            ELSE TO_NUMBER(ST.BR_NO_NOM)
            END) "Balance1"
    ,ST.BR_ACC_NO "Nostro_Account"
    ,ST.CU_ACCOUNT_CCY "Currency_Code"
FROM v_FBNK_SEC_TRADE ST
LEFT  JOIN v_F_SECURITY_MASTER SM ON ST.SECURITY_CODE = SM.SECURITY_CODE
WHERE ST.CUSTOMER_NO = '999999'
    AND ST.BR_NO_NOM IS NOT NULL
    AND TO_NUMBER(ST.BR_NO_NOM) > 0
    AND ST.MATURITY_DATE < (
        SELECT TODAY
        FROM v_F_DATES
        WHERE RECID = 'TT0010001'
        )
GROUP BY ST.SECURITY_CODE
    ,SM.PORTFOLIO_CLASS
    ,ST.MATURITY_DATE
    ,TO_NUMBER(ST.BR_NO_NOM)
    ,ST.BR_ACC_NO
    ,ST.CU_ACCOUNT_CCY

Try with this:

SELECT ST.SECURITY_CODE "ID"
    ,SM.PORTFOLIO_CLASS "Main_Type"
    ,ST.MATURITY_DATE "Maturity_Date"
    ,SUM(CASE 
            WHEN ST.CUST_TRANS_CODE = 'SEL'
                THEN TO_NUMBER(ST.BR_NO_NOM) * - 1
            ELSE TO_NUMBER(ST.BR_NO_NOM)
            END) "Balance1"
    ,ST.BR_ACC_NO "Nostro_Account"
    ,ST.CU_ACCOUNT_CCY "Currency_Code"
FROM v_FBNK_SEC_TRADE ST
LEFT  JOIN v_F_SECURITY_MASTER SM ON ST.SECURITY_CODE = SM.SECURITY_CODE
WHERE ST.CUSTOMER_NO = '999999'
    AND ST.BR_NO_NOM IS NOT NULL
    AND TO_NUMBER(ST.BR_NO_NOM) > 0
    AND ST.MATURITY_DATE < (
        SELECT max(TODAY)
        FROM v_F_DATES
        WHERE RECID = 'TT0010001'
        )
GROUP BY ST.SECURITY_CODE
    ,SM.PORTFOLIO_CLASS
    ,ST.MATURITY_DATE
    ,ST.BR_ACC_NO
    ,ST.CU_ACCOUNT_CCY

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM