首页 > 解决方案 > 如何使用 where 子句中的子查询修复 Oracle“不是 GROUP BY 表达式”错误

问题描述

当我在 where 子句中添加子查询条件时,我有以下查询中断。如果我放置一个文本值,它会起作用,如果我删除子查询条件它会起作用。

子查询自行工作并返回单个值。我尝试先创建一个 CTE,重新排列查询,当我添加特定条件时它总是会中断。

得到 ORA-00979: not a GROUP BY 表达式的原因可能是什么?

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

标签: sqloracle

解决方案


这将起作用:

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

推荐阅读