oracle SQL - Case表达式:如何在一个WHEN中使用多个条件

3okqufwl  于 2023-11-17  发布在  Oracle
关注(0)|答案(3)|浏览(221)

我想在一个WHEN中使用多个条件,但它返回错误'not a single-group group group function'我使用Oracle SQL Developer

SELECT

CASE WHEN (TB2.BENE_CODE NOT LIKE '%ET%') AND (SUM(TB2.APPROVE_TOTAL)
> 0)   THEN SUM(TB2.APPROVED_TOTAL)
     ELSE 0 END AS Total_PayAmount  

FROM clm_header_tr TB1

字符串

结果为ORA-00937:不是单组群函数

我试着用()分离条件,但它不起作用。
那么根本原因是什么呢?我该如何解决呢?谢谢。

rqenqsqc

rqenqsqc1#

你应该在case周围求和(),而不是在case里面:

SELECT 
SUM(CASE 
    WHEN (TB2.BENE_CODE NOT LIKE '%ET%') AND (TB2.APPROVE_TOTAL > 0) 
    THEN TB2.APPROVED_TOTAL
     ELSE 0 END) AS Total_PayAmount  
FROM clm_header_tr TB1

字符串
如果你想比较聚合数据和某些字段数据,那么你应该首先做一个使用分析变量的子查询:sum() over (),它将显示每个字段的聚合数据,然后你可以在case中使用它。

tyg4sfes

tyg4sfes2#

一般来说,这一切都取决于你想得到的结果。张贴一个无效的代码(错别字,错别字.)没有任何样本数据,应该适用于该规则和期望的结果并不能帮助我们帮助你。
我创建了自己的示例表,而您的代码-如您所知-不起作用:

SQL> SELECT
  2  CASE WHEN (TB2.BENE_CODE NOT LIKE '%ET%') AND (SUM(TB2.APPROVED_TOTAL) > 0) THEN SUM(TB2.APPROVED_TOTAL)
  3       ELSE 0
  4  END AS Total_PayAmount
  5  FROM clm_header_tr TB2;
CASE WHEN (TB2.BENE_CODE NOT LIKE '%ET%') AND (SUM(TB2.APPROVED_TOTAL) > 0) THEN SUM(TB2.APPROVED_TOTAL)
           *
ERROR at line 2:
ORA-00937: not a single-group group function

字符串
如果你在一个group by子句中包含一个列,代码 * 工作 *,但是-这是你需要的吗?回到起点:样本数据,规则,期望的结果。

SQL> SELECT
  2  CASE WHEN (TB2.BENE_CODE NOT LIKE '%ET%') AND (SUM(TB2.APPROVED_TOTAL) > 0) THEN SUM(TB2.APPROVED_TOTAL)
  3       ELSE 0
  4  END AS Total_PayAmount
  5  FROM clm_header_tr TB2
  6  GROUP BY tb2.bene_code;

TOTAL_PAYAMOUNT
---------------
           1300
           5000
           2450

SQL>

iugsix8n

iugsix8n3#

看看下面的代码:

WITH    --  S a m p l e    D a t a :
    tbl (ID, BENE_CODE, APPROVED_TOTAL) AS
        (   Select 1, 'AET01',       10 From Dual Union All
            Select 2, 'AET02',       50 From Dual Union All
            Select 3, 'AFT01ASD',    90 From Dual Union All 
            Select 4, 'CKT01',      111 From Dual Union All
            Select 5, 'ET',         200 From Dual 
        )
-- Your code :      
SELECT    CASE WHEN (BENE_CODE NOT LIKE '%ET%') AND (SUM(APPROVED_TOTAL) > 0)
               THEN SUM(APPROVED_TOTAL)
          ELSE 0 
          END AS Total_Pay_Amount  
FROM      tbl
--  ORA-00937: not a single-group group function

字符串
1.贝内_CODE的总支付金额不像“%ET%”

SELECT    Sum(CASE WHEN (BENE_CODE NOT LIKE '%ET%') 
               THEN APPROVED_TOTAL
          ELSE 0 
          END) AS Total_Pay_Amount  
FROM      tbl
--  TOTAL_PAY_AMOUNT
--  ----------------
--               201


1.包含“ET”和不包含“ET”的贝内_CODE的总支付金额

Select      Case    When BENE_CODE LIKE '%ET%' Then 'ET_CONTAINED'
            Else 'ET_NOT_CONTAINED'
            End  "BENE_CODE_ET_STAT", 
            Sum(APPROVED_TOTAL) AS Total_Pay_Amount  
From        tbl
Group By    Case    When BENE_CODE LIKE '%ET%' Then 'ET_CONTAINED'
            Else 'ET_NOT_CONTAINED'
            End
--  BENE_CODE_ET_STA TOTAL_PAY_AMOUNT
--  ---------------- ----------------
--  ET_CONTAINED                  260
--  ET_NOT_CONTAINED              201


如果在选择列表中使用未聚合的列而未按该列对结果进行分组,则会出现ORA-00937:not a single-group group group function错误。
根据您想要获得的内容,有两个选择命令可以工作。
1st - select Sum(Case expression resulting value)-这是聚合列,因此您不需要group by -结果只有一行
第二-选择两个和-在选择列表中有Case表达式-在Group By子句中有相同的Case-结果有2行...
关于你关于Case表达式中的多个条件的问题-你可以像在其他任何地方一样使用它-下面是一个例子(与上面的第一个选项相同):

SELECT    Sum(CASE WHEN BENE_CODE NOT LIKE '%ET%' And APPROVED_TOTAL > 0 
               THEN APPROVED_TOTAL
          ELSE 0 
          END) AS Total_Pay_Amount  
FROM      tbl
--  TOTAL_PAY_AMOUNT
--  ----------------
--               201

相关问题