Alguem pode me explicar como este codigo sql funciona ? (resolvido )

na verdade eu queria fazer o seguinte
sql 1

select max(avg(insc_quantia)) 
from  zz_view_inscricao_completa 
group by alunosProvincia

mas quando eu fiz assim deu erro então fiz da seguinte forma que vi na internet e deu certo, mas nao entendi bem o porque que deu certo.

alguem pode me explicar o funcionamento deste codigo sql???
sql2

SELECT *, max(ttt) FROM 
(  select avg(insc_quantia) as ttt 
from  zz_view_inscricao_completa 
group by alunosProvincia )
 as dddd
;

eu nunca aprendi nem nunca vi uma sintaxe de codigo sql assim, e fiquei pasmo, como é que funcionou

neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço

SELECT *, max(ttt) FROM ( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia ) as dddd ;

é facil
isso é um select e um subselect

o subselect é como uma tabela temporaria
vc esta dando um select nos dados que estao vindo do subselect
o nome da tua tabela temporaria é ‘dddd’ e vc esta somando uma o campo dela ‘ttt’

[quote=felipedamiani]neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço
[/quote]

olha valeu mano, !!! mas parece que nao leste bem,.
a minha duvida é apenas no segundo trecho.
porque o primeiro trecho fui eu que fiz :slight_smile: :slight_smile: , mas infelizmente o primeiro trecho nao funcionou, na minha logica e na minha teoria deveria funcionar, mas nao funcionou, e entao procurei na internet, e notei que devia fazer como esta no segundo trecho, e entao fiz e funcionou, mas o problema é que funcionou e mesmo assim eu nao entendi o porque que funcionou, e tambem nao entendi o porque que o primeiro trecho nao funcionou

[quote=papagaio]SELECT *, max(ttt) FROM ( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia ) as dddd ;

é facil
isso é um select e um subselect

o subselect é como uma tabela temporaria
vc esta dando um select nos dados que estao vindo do subselect
o nome da tua tabela temporaria é ‘dddd’ e vc esta somando uma o campo dela ‘ttt’[/quote]

ok, agora estou a começar a entender a logica disso, valeu,
devo entender o subselect como uma tabela temporaria porque o subselect esta no campo from onde devia ficar os dados das ou da tabela.

o problema é que eu nao gosto que as coisas funcionem ,sem eu entender bem

valeu, ja entendi , e vou ver se exercito esta sintaxi, para ver se me acostumo,
mas ja agora eu acho que o primeiro trecho devia funcionar, nao entendo o porque que nao funciona??? tens alguma idea do que tem de errado no primeiro trecho??? :idea: :idea: :idea:

A diferença é que no segundo treço vc tira a média e depois agrupa, aí sim pega o maior valor

No primeiro vc tira a média, pega o maior valor e agrupa.

Tendeu?

[quote=sulito][quote=felipedamiani]neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço
[/quote]

olha valeu mano, !!! mas parece que nao leste bem,.
a minha duvida é apenas no segundo trecho.
porque o primeiro trecho fui eu que fiz :slight_smile: :slight_smile: , mas infelizmente o primeiro trecho nao funcionou, na minha logica e na minha teoria deveria funcionar, mas nao funcionou, e entao procurei na internet, e notei que devia fazer como esta no segundo trecho, e entao fiz e funcionou, mas o problema é que funcionou e mesmo assim eu nao entendi o porque que funcionou, e tambem nao entendi o porque que o primeiro trecho nao funcionou[/quote]

fiz uma prova ontem que saiu uma pergunta desse genero, e entao cheguei em casa e recriei o cenario com outras tabelas de um banco de dados que eu tinha,
mas na prova eu meti como estava o primeiro trecho de codigo,
e cheguei em casa testei e nao funcionou, entao pesquisei e cheguei no segundo trecho

[quote=ateubh]A diferença é que no segundo treço vc tira a média e depois agrupa, aí sim pega o maior valor

No primeiro vc tira a média, pega o maior valor e agrupa.

Tendeu?

[quote=sulito][quote=felipedamiani]neste trecho

( select avg(insc_quantia) as ttt from zz_view_inscricao_completa group by alunosProvincia )

ele seleciona as médias (avg), depois ele faz um select neste resultado (subselect), buscando o máximo.
isso porque ele primeiro precisa saber as médias, para depois poder calcular o máximo, entendeu?

Abraço
[/quote]

olha valeu mano, !!! mas parece que nao leste bem,.
a minha duvida é apenas no segundo trecho.
porque o primeiro trecho fui eu que fiz :slight_smile: :slight_smile: , mas infelizmente o primeiro trecho nao funcionou, na minha logica e na minha teoria deveria funcionar, mas nao funcionou, e entao procurei na internet, e notei que devia fazer como esta no segundo trecho, e entao fiz e funcionou, mas o problema é que funcionou e mesmo assim eu nao entendi o porque que funcionou, e tambem nao entendi o porque que o primeiro trecho nao funcionou[/quote][/quote]

ok, valeu a dica, ja entendi a diferença entre eles. eu pensava que eu entendia tudo sobre consultas, mas notei que afinal ainda tem muitos segredos, valeu a força gujeiros :slight_smile: :slight_smile: todos os dias se aprende algo novo

topico resolvido :slight_smile: :slight_smile:

Oi Sulito,

Vou tentar explicar o quê entendi do seu problema.

Acredito que o código que vc escreveu (primeiro trecho) não funcionou porque o banco de dados que vc utiliza verifica se é possivel a execução de função (AVG) dentro de outra função (MAX). Nem todas funções podem ser executadas recebendo qualquer outra função como parametro, ha critérios para isso, me parece que é o seu caso ( MAX e AVG).

No código que vc encontrou na net (segundo trecho) acontece o seguinte): As execuções das funções acontecem SEPARADAS, primeiro ocorre a execução da função AVG no subselect (já foi explicado pelo nosso amigo) e logo em seguida a banco de dados executa a função MAX utilizando como parametro o resultado do subselect que utilizou o AVG. Ou seja, a idéia central do código é a separação e priorização das execuções das funções MAX e AVG. A função AVG é executada em primeiro lugar e a MAX em segundo e única ligação que existe entre elas são os dados resultantes.

flws

tentei executar no mysql, me falta tentar no oracle, talvez ele aceite excutar o primeiro trecho onde tem o max(avg)

[quote=fantomas]Oi Sulito,

Vou tentar explicar o quê entendi do seu problema.

Acredito que o código que vc escreveu (primeiro trecho) não funcionou porque o banco de dados que vc utiliza verifica se é possivel a execução de função (AVG) dentro de outra função (MAX). Nem todas funções podem ser executadas recebendo qualquer outra função como parametro, ha critérios para isso, me parece que é o seu caso ( MAX e AVG).

No código que vc encontrou na net (segundo trecho) acontece o seguinte): As execuções das funções acontecem SEPARADAS, primeiro ocorre a execução da função AVG no subselect (já foi explicado pelo nosso amigo) e logo em seguida a banco de dados executa a função MAX utilizando como parametro o resultado do subselect que utilizou o AVG. Ou seja, a idéia central do código é a separação e priorização das execuções das funções MAX e AVG. A função AVG é executada em primeiro lugar e a MAX em segundo e única ligação que existe entre elas são os dados resultantes.

flws
[/quote]
Mas gostei da tua logica de raciocinio,