带有 SUM 的 Oracle 案例陈述

Posted

技术标签:

【中文标题】带有 SUM 的 Oracle 案例陈述【英文标题】:Oracle CASE STATEMENT WITH SUM 【发布时间】: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 处理后创建)。 机会为零。我试着简单的表格,查询问题。 【参考方案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

【讨论】:

以上是关于带有 SUM 的 Oracle 案例陈述的主要内容,如果未能解决你的问题,请参考以下文章

日期计算在 Oracle SQL 案例语句中不起作用?

Oracle 中 CASE WHEN 语句中的 SUM

根据参数 -Oracle 重新启动 sum(over) 函数

结合案例陈述[重复]

oracle sql case语句

如何在 Oracle SQL 中使用案例或解码作为分析窗口函数的一部分