Função MAX() com HAVING
31/01/2019
0
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
Igor
Post mais votado
01/02/2019
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!
Jucélio Silva
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);
01/02/2019
Igor
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.
01/02/2019
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;
Clique aqui para fazer login e interagir na Comunidade :)