Eu tenho a tabela abaixo -
MOBILE AMOUNT
-----------------
M1 10
M1 20
M1 30
M2 40
M2 10
M3 30
Quero encontrar a contagem de celulares distintos com valor total superior a 40.
Então, eu escrevi consulta com consulta interna como -
select count(mobile)
from
(
select mobile,sum(amount)
from TAB
group by mobile
having sum(amount) >40
)
Existe uma maneira de escrever isso com consulta simples, ou seja, sem consulta interna.
Produção necessária (como apenas M1 e M2 possuem soma (quantidade)> 40) -
CNT
---
2
Respostas:
0 para resposta № 1A consulta aninhada que você forneceu no seu exemplo é a correta. Você está solicitando uma agregação em um nível superior ao SUM(amount)
; você está solicitando o número de grupos resultantes.
No seu comentário, você mencionou que a principal preocupação é que a estrutura da instrução SQL muda quando você inclui a agregação. É assim que a linguagem SQL lida com diferentes semânticas de consulta.
Apenas mudando WHERE
As cláusulas permitirão apenas trocar as condições do filtro.
Se você deseja habilitar a filtragem de características agregadas, é necessário ter uma abordagem de vários níveis com o SQL.
1 para resposta № 2
Talvez algo assim?
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>