Função MAX() com HAVING

31/01/2019

13

xerox qtd_xerox valor data_s restcot aux nomeserv cpfserv tiposerv maxcot total_xerox
87 10 0.00 2019-01-31 16:15:39.0 70 10 igor 515.915.151-51 Professor 80 30
88 20 0.00 2019-01-31 16:15:47.0 50 20 igor 515.915.151-51 Professor 80 30
89 10 0.00 2019-01-31 16:16:05.0 70 10 junior 515.954.887-84 Professor 80 40
90 30 0.00 2019-01-31 16:16:11.0 40 30 junior 515.954.887-84 Professor 80 40



Quero duplicar os registros 88 e 90. Mas ele está duplicando os registros 87 e 89.
Sei que tenho filtrar o maior "xerox" do grupo cpfserv.


CREATE EVENT adicionar_linha ON SCHEDULE EVERY 30 second DO
INSERT INTO tbxerox (qtd_xerox,valor,data_s,restcota,cpf,aux)
SELECT qtd_xerox,valor,data_s,restcota,cpf,aux FROM tbxerox x
where x.cpf = x.cpf
group by x.cpf;

Resultado da consulta

xerox qtd_xerox valor data_s restcot aux nomeserv cpfserv tiposerv maxcot total_xerox
87 10 0.00 2019-01-31 16:15:39.0 70 10 igor 515.915.151-51 Professor 80 30
88 20 0.00 2019-01-31 16:15:47.0 50 20 igor 515.915.151-51 Professor 80 30
89 10 0.00 2019-01-31 16:16:05.0 70 10 junior 515.954.887-84 Professor 80 40
90 30 0.00 2019-01-31 16:16:11.0 40 30 junior 515.954.887-84 Professor 80 40
91 10 0.00 2019-01-31 16:15:39.0 70 10 igor 515.915.151-51 Professor 80 30
92 10 0.00 2019-01-31 16:16:05.0 70 10 junior 515.954.887-84 Professor 80 40


O que eu queria:


xerox qtd_xerox valor data_s restcot aux nomeserv cpfserv tiposerv maxcot total_xerox
87 10 0.00 2019-01-31 16:15:39.0 70 10 igor 515.915.151-51 Professor 80 30
88 20 0.00 2019-01-31 16:15:47.0 50 20 igor 515.915.151-51 Professor 80 30
89 10 0.00 2019-01-31 16:16:05.0 70 10 junior 515.954.887-84 Professor 80 40
90 30 0.00 2019-01-31 16:16:11.0 40 30 junior 515.954.887-84 Professor 80 40
91 20 0.00 2019-01-31 16:15:47.0 50 20 igor 515.915.151-51 Professor 80 30
92 30 0.00 2019-01-31 16:16:11.0 40 30 junior 515.954.887-84 Professor 80 40
Responder

Post mais votado

01/02/2019

E ae Igor,

Bem cara não entendi o que está tentado fazer com essa query, mas vou te explicar como fazer para usar a função max juntamente com having e sobre agrupamentos, talvez isso te de uma luz...

1° Tenho uma tabela com vários pedidos de N clientes e preciso pegar qual foi o último pedido desse cliente , carregando o numero do pedido e o código desse cliente :

select max(num_pedido),cod_cliente from pedidos
group by nom_cliente
order by nom_cliente

Isso me traria o maior pedido de cada cliente, as funções de agrupamento precisam que tudo que não está dentro de alguma função esteja no group by, logo o nome do cliente precisa ser agrupado, isso para todas as funções de agrupamento MIN,MAX,SUM etc....

2° Imaginando que preciso colocar a data da venda dos pedidos juntos , seguindo a mesma regra de agrupamento :
select max(num_pedido),cod_cliente,data_venda from pedidos
group by cod_cliente,data_veda
order by cod_cliente

Isso ferraria o grupo, pois o retorno seria vários pedidos do cliente com N datas, vendo em vista que para agrupar algo o dado tem que ser idêntico, agruparia somente as vendas do cliente cuja data fosse no mesmo dia, mas se o campo fosse data e hora , então nem isso agruparia.
Para resolver essa situação usa-se sub-query , onde eu precisaria antes saber qual é o último pedido e depois pegar as informações que preciso, só lembrando que toda sub-query só pode ter um retorno direto para a consulta, teria que ser algo dese tipo :

select p1.num_pedido,p1.cod_cliente,p1.data_venda from pedidos p1
where p1.num_pedido in (select max(p2.num_pedido) from pedidos p2 where p2.cod_cliente = p1.cod_cliente )
order by p1.cod_cliente

Nesse caso não precisamos mais de grupo pois a sub-query já te retorna 1 registro agrupado do cliente , sendo o ultimo, e a query externa pode ser montada com todos o campos livremente.

3° Então chegamos no Having , ele serve para que você possa condicionar o grupo, pegar os dados já agrupados e colocar uma condição nesses dados, imaginado que preciso somar todas as vendas da minha empresa, mas as vendas menores que X não precisam ser listadas , então seria algo assim :

select SUM(val_venda), cod_cliente from pedidos
group by cod_cliente
having SUM(val_venda) > X

Logo segue a mesma regra , temos que agrupar o que está foda da função SUM , depois teremos os valores, mas só queremos o que for maior que X então o having aplica essa condição no agrupamento.

Espero que te de uma luz de como estruturar seus dados, fiz de forma bem simplificada para que possa entender o conceito , com isso em mente é só colocar na sua necessidade.

Boa Sorte!
Responder

Mais Posts

31/01/2019

Igor


TENTEI UTILIZAR O HAVING ASSIM, MAS NADA ACONTECEU

CREATE EVENT adicionar_linha ON SCHEDULE EVERY 30 second DO
INSERT INTO tbxerox (qtd_xerox,valor,data_s,restcota,cpf,aux,xerox)
SELECT qtd_xerox,valor,data_s,restcota,cpf,aux,xerox FROM tbxerox x
where x.cpf = x.cpf
group by x.cpf
having max(xerox);
Responder

01/02/2019

Alex Lekao

Confesso que também não entendi a necessidade.

Responder

01/02/2019

Igor

Confesso que também não entendi a necessidade.




Tenho uma tabela com vários pedidos de N clientes e preciso pegar qual foi o último pedido desse cliente , carregando o numero do pedido e o código desse cliente.

É isso de forma resumida.
Responder

01/02/2019

Igor

E ae Igor,

Bem cara não entendi o que está tentado fazer com essa query, mas vou te explicar como fazer para usar a função max juntamente com having e sobre agrupamentos, talvez isso te de uma luz...

1° Tenho uma tabela com vários pedidos de N clientes e preciso pegar qual foi o último pedido desse cliente , carregando o numero do pedido e o código desse cliente :

select max(num_pedido),cod_cliente from pedidos
group by nom_cliente
order by nom_cliente

Isso me traria o maior pedido de cada cliente, as funções de agrupamento precisam que tudo que não está dentro de alguma função esteja no group by, logo o nome do cliente precisa ser agrupado, isso para todas as funções de agrupamento MIN,MAX,SUM etc....

2° Imaginando que preciso colocar a data da venda dos pedidos juntos , seguindo a mesma regra de agrupamento :
select max(num_pedido),cod_cliente,data_venda from pedidos
group by cod_cliente,data_veda
order by cod_cliente

Isso ferraria o grupo, pois o retorno seria vários pedidos do cliente com N datas, vendo em vista que para agrupar algo o dado tem que ser idêntico, agruparia somente as vendas do cliente cuja data fosse no mesmo dia, mas se o campo fosse data e hora , então nem isso agruparia.
Para resolver essa situação usa-se sub-query , onde eu precisaria antes saber qual é o último pedido e depois pegar as informações que preciso, só lembrando que toda sub-query só pode ter um retorno direto para a consulta, teria que ser algo dese tipo :

select p1.num_pedido,p1.cod_cliente,p1.data_venda from pedidos p1
where p1.num_pedido in (select max(p2.num_pedido) from pedidos p2 where p2.cod_cliente = p1.cod_cliente )
order by p1.cod_cliente

Nesse caso não precisamos mais de grupo pois a sub-query já te retorna 1 registro agrupado do cliente , sendo o ultimo, e a query externa pode ser montada com todos o campos livremente.

3° Então chegamos no Having , ele serve para que você possa condicionar o grupo, pegar os dados já agrupados e colocar uma condição nesses dados, imaginado que preciso somar todas as vendas da minha empresa, mas as vendas menores que X não precisam ser listadas , então seria algo assim :

select SUM(val_venda), cod_cliente from pedidos
group by cod_cliente
having SUM(val_venda) > X

Logo segue a mesma regra , temos que agrupar o que está foda da função SUM , depois teremos os valores, mas só queremos o que for maior que X então o having aplica essa condição no agrupamento.

Espero que te de uma luz de como estruturar seus dados, fiz de forma bem simplificada para que possa entender o conceito , com isso em mente é só colocar na sua necessidade.

Boa Sorte!



Muito Obrigado pela resposta!

Só acrescentei o "desc" no "order by" e deu certo assim:

INSERT INTO tbxerox (qtd_xerox,valor,data_s,restcota,cpf,aux)
SELECT qtd_xerox,valor,data_s,restcota,cpf,aux FROM tbxerox x
group by x.cpf
order by x.cpf desc;
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar