【问题标题】:Group by expression with case statement in oracle?用oracle中的case语句按表达式分组?
【发布时间】:2020-12-01 07:45:57
【问题描述】:

我有一个带有 case 语句的查询。

select
   COUNTRY_CODE,
   CUST_USR_ID,
   (
      case
         when
            FACILITY_ID is not null 
         then
            FACILITY_ID 
         when
            ACCOUNT_NO is not null 
         then
            ACCOUNT_CLASS 
      end
   )
   ACC_FA_ID, count(1), 
   (
      case
         when
            FACILITY_ID is not null 
         then
            'FACILITY_ID' 
         else
            'ACCOUNT_CLASS' 
      end
   )
   IDENTIFIERS 
from
   Mytable 
where
   (
      FACILITY_ID is not null 
      or ACCOUNT_NO is not null
   )
group by
   COUNTRY_CODE, CUST_USR_ID, 
   (
      case
         when
            FACILITY_ID is not null 
         then
            FACILITY_ID 
         when
            ACCOUNT_NO is not null 
         then
            ACCOUNT_CLASS 
      end
   )

这个查询给了我错误

ORA-00979: 不是 GROUP BY 表达式

当我从 select 中删除最后一个 case 语句时,它运行良好。请在这方面帮助我

【问题讨论】:

  • 请添加一些关于此查询预期执行的描述并添加一些示例数据。错误是因为当您在选择列表中有聚合函数时 - 所有其他选择列表表达式必须包含在“分组依据”子句中

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

未聚合的列应该是GROUP BY 子句的一部分。这意味着“解决方案”

  • 不是要从SELECT 中删除第二个CASE,而是要
  • 将其包含到GROUP BY

类似的东西(CTE 在这里只是为了提供一些示例数据以显示查询有效;它是否产生了你的意思,我不知道):

SQL> WITH mytable (
  2    country_code, cust_usr_id, facility_id, account_no, account_class
  3  ) AS
  4  (SELECT 1, 1, 1, 1, 1 FROM dual UNION ALL
  5   SELECT 1, 2, 3, 4, 5 FROM DUAL
  6  )
  7  SELECT country_code,
  8         cust_usr_id,
  9         CASE
 10           WHEN facility_id IS NOT NULL THEN
 11             facility_id
 12           WHEN account_no IS NOT NULL THEN
 13             account_class
 14         END acc_fa_id,
 15         COUNT(1),
 16        --
 17         CASE
 18           WHEN facility_id IS NOT NULL THEN
 19             'FACILITY_ID'
 20           ELSE
 21             'ACCOUNT_CLASS'
 22         END identifiers
 23  FROM mytable
 24  WHERE (   facility_id IS NOT NULL
 25         OR account_no  IS NOT NULL)
 26  GROUP BY country_code,
 27           cust_usr_id,
 28           CASE
 29             WHEN facility_id IS NOT NULL THEN
 30               facility_id
 31             WHEN account_no IS NOT NULL THEN
 32               account_class
 33           END,
 34           CASE
 35             WHEN facility_id IS NOT NULL THEN
 36               'FACILITY_ID'
 37             ELSE
 38               'ACCOUNT_CLASS'
 39           END;

COUNTRY_CODE CUST_USR_ID  ACC_FA_ID   COUNT(1) IDENTIFIERS
------------ ----------- ---------- ---------- -------------
           1           2          3          1 FACILITY_ID
           1           1          1          1 FACILITY_ID

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多