【问题标题】:Oracle CASE STATEMENT WITH SUM带有 SUM 的 Oracle 案例陈述
【发布时间】:2017-08-30 07:57:29
【问题描述】:

我在使用 select 语句返回正确信息时遇到问题

表:

name1  | name2  | amount
------ | ------ | --------
Fred   | Fred   | 10
Bob    | Fred   | 15
Sam    | Sam    | 100

这是我的查询

SELECT 
        CASE WHEN name1 <> name2 THEN name2
        ELSE name1 END as name,
        SUM(amount) as amount
FROM table
GROUP BY???

我希望看到的结果:

name  | amount
----- | ------
Fred  | 25
Sam   | 100

我尝试使用 group by 并收到错误消息,指出这不是 GROUP BY 表达式。如果我不使用 group by 我收到错误不是单组组功能。这种查询可能吗?

【问题讨论】:

  • 如果在name1name2 中不允许有NULL,那么你似乎把事情复杂化了;结果总是等于name2。唯一的例外是如果name1name2 为NULL(如果允许的话)。那么:你可以在任一列中都有 NULL 吗?
  • 在任何情况下,您都可以使用与 SELECT 中完全相同的 CASE 表达式进行 GROUP BY。 (不幸的是,您不能使用 NAME 别名,因为它仅在 GROUP BY 处理后创建)。
  • 机会为零。我试着简单的表格,查询问题。

标签: sql oracle aggregate-functions


【解决方案1】:

GROUP BY 子句的计算结果必须与您的 select 子句相同。这样做:

SELECT 
    CASE WHEN name1 <> name2 THEN name2 ELSE name1 END as calc_name,
    SUM(amount) as amount
FROM table
GROUP BY CASE WHEN name1 <> name2 THEN name2 ELSE name1 END 

另外,name 是保留关键字,所以我稍微修改了这个别名。

【讨论】:

  • 我试过这个并得到这个错误:错误:ORA-00979:不是 GROUP BY 表达式
  • 这告诉我它找不到您要分组的字段,这意味着您可能在其中的某个地方有错字,无论是在 SELECT 子句还是 GROUP BY 子句中。仔细梳理打字。
【解决方案2】:

试一试

SELECT ename,SUM(amount) amount FROM (
SELECT 
        CASE WHEN name1 <> name2 THEN name2
        ELSE name1 END as ename,
        amount
FROM table)
GROUP BY ename

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2017-03-06
    • 2023-04-10
    • 2010-10-30
    • 2016-02-21
    相关资源
    最近更新 更多