带有 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 我收到错误不是单组组功能。这种查询可能吗?
【问题讨论】:
如果在name1
和name2
中不允许有NULL,那么你似乎把事情复杂化了;结果总是等于name2
。唯一的例外是如果name1
或name2
为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 案例陈述的主要内容,如果未能解决你的问题,请参考以下文章