使用带有HAVING子句的两个聚合函数

时间:2018-02-19 07:39:44

标签: sql oracle oracle11g hana

我有下表 -

MOBILE    AMOUNT
-----------------
M1          10
M1          20 
M1          30
M2          40   
M2          10
M3          30

我想找到总数超过40的不同手机的数量。

所以我用内部查询编写了查询 -

select count(mobile)
from
(
select mobile,sum(amount)
from TAB
group by mobile
having sum(amount) >40
)

有没有办法用普通查询写这个,即没有内部查询。

需要输出(因为只有M1和M2具有总和(量)> 40) -

CNT
---
2

2 个答案:

答案 0 :(得分:1)

也许是这样的?

SQL> with test (mobile, amount) as
  2  (select 'm1', 10 from dual union
  3   select 'm1', 20 from dual union
  4   select 'm1', 30 from dual union
  5   select 'm2', 40 from dual union
  6   select 'm2', 10 from dual union
  7   select 'm3', 30 from dual
  8  )
  9  select sum(count(distinct mobile)) cnt
 10  from test
 11  group by mobile
 12  having sum(amount) > 40;

       CNT
----------
         2

SQL>

答案 1 :(得分:0)

您在示例中提供的嵌套查询是正确的。您要求的汇总级别高于SUM(amount);你要的是结果组的数量。

在您的评论中,您提到主要关注的是当您包含聚合时,SQL语句的结构会发生变化。这就是SQL语言如何处理不同的查询语义 只更改WHERE子句只允许交换过滤条件。

如果要对聚合特征启用过滤,则必须使用SQL的多级方法。