Página 1 de 1

Mysql: possível erro em having

Enviado: 23 Jul 2020 01:31
por cjp
Pessoal, alguém poderia por favor me indicar se há algum erro neste comando:
Select CODIGO, compvenda as quantidade,SUM(COMPVENDA)*cotacao as SOMA from acoes WHERE status='E' AND conta='CL' AND vinculo=0 AND dtcotacao<=now() group by CODIGO having SOMA > 0 ORDER by dtcotacao
Digo isto porque, para o código PRLI11, por exemplo, está retornando a quantidade 100, mas, conforme imagem anexa, o correto seria retornar 200.

Podem me ajudar?

Mysql: possível erro em having

Enviado: 23 Jul 2020 02:30
por JoséQuintas
cjp escreveu:Pessoal, alguém poderia por favor me indicar se há algum erro neste comando:
comparar seleção diferente, é lógico que fica diferente

Código: Selecionar todos

Select CODIGO, compvenda as quantidade,SUM(COMPVENDA)*cotacao as SOMA
 from acoes 
WHERE status='E' AND conta='CL' AND vinculo=0 AND dtcotacao<=now()
 group by CODIGO having SOMA > 0 ORDER by dtcotacao
Como está puxando compvenda e SUM(compvenda) ao mesmo tempo?
quer o individual e a soma agrupada ao mesmo tempo?
mas como individual se quer totalizado?

e pra conferir?
peça o mesmo do outro comando

Código: Selecionar todos

Select CODIGO, compvenda as quantidade
 from acoes 
WHERE codigo = 'PLRI11' and status='E' AND conta='CL' AND vinculo=0 AND dtcotacao<=now() and compvenda > 0
ou pelo menos confira o que é usado no outro select

Código: Selecionar todos

Select CODIGO, compvenda, dtcotacao, vinculo, conta
 from acoes 
WHERE codigo = 'PLRI11' and status='E' and compvenda > 0

Mysql: possível erro em having

Enviado: 23 Jul 2020 21:05
por cjp
Fiz os 3 testes, conforme imagens anexas.

A ideia é obter uma lista como no primeiro anexo, com as quantidades totais por cada código e a soma dos valores por cada código, sendo que a soma dos valores é a quantidade X o valor de cada código.

O problema é que, em alguns casos, como neste código PRLI11, a informação não está sendo fornecida corretamente, não sei porquê.

Mysql: possível erro em having

Enviado: 23 Jul 2020 23:14
por JoséQuintas
Princípio básico: Tentou fazer com papel e caneta?
Faça a conta com papel e caneta.
Senão... vai ficar postando imagens no fórum o tempo todo.

O que tá errado?
Impossível alguém responder

Faça com papel e caneta e vai ter a resposta.

Só imagino uma possibilidade: uma coisa que não está em nenhuma consulta, que vai descobrir assim que tentar fazer uma conta com papel e caneta, porque vai precisar dessa coisa.
Não vou dizer o que ACHO que é, porque vai postar mais e mais imagens....

Apenas faça a conta de um único, qualquer um, e vai saber.

Não temos como fazer isso, vai descobrir assim que fizer um.

Mysql: possível erro em having

Enviado: 24 Jul 2020 01:08
por Vlademiro
Se bem me recordo, o comando group by deve conter todas as colunas do select

Ex:

Código: Selecionar todos

select codigo, vendedor , sum(valor) from vendas_dia
group by codigo, vendedor
having sum(valor) > 200
Você não colocou a outra coluna (quantidade) no group by.
Ela, na verdade era para estar totalizada : sum(quantidade)

Mysql: possível erro em having

Enviado: 24 Jul 2020 11:02
por JoséQuintas
Sinceramente.... não entendo o CJP
Parece ser difícil usar a cabeça....
Postar imagem tá craque...

Vamos lá....
usando papel e caneta....

quantidade x valor tá errado.

quanto é a quantidade?
quanto é o valor?

Olhando todos os posts e imagens.... em nenhum deles tem valor.

Como é que ele conferiu e chegou a conclusão que estava errado? não faço a menor idéia...

Como é que ele quer que a gente responda? não faço a menor idéia.

Mysql: possível erro em having

Enviado: 24 Jul 2020 17:07
por JoséQuintas
Ao CJP:

A intenção é apenas chamar a atenção que você pode resolver muitos problemas sozinho, usando o princípio bem básico.

Quando sugeri usar papel e caneta...

SUM( compvenda ) * cotacao

Se cotacao for zero.... o resultado vai ser zero
Usando papel e caneta, obrigatoriamente vai ver que precisa olhar o valor de cotacao pra fazer essa conta.
Muito provavelmente o problema está aí, e não dá pra ver em nada do que foi postado

Palavras de um conhecido: Se funciona no papel, funciona no computador

Achei essas palavras muito interessantes, e não se trata apenas dessa conta.
Exemplo: um controle de estoque numa empresa não funciona. Funciona no papel? os usuários estão preenchendo papel sobre o que foi retirado do estoque? se eles não fazem isso no papel, vão fazer menos ainda sendo pelo computador, e não vai ter aplicativo que resolva isso.

Então a pergunta: qual o resultado disso fazendo no papel?

Assim que tiver conferido, SE NÃO resolver sozinho, poste toda informação que foi usada pra fazer as contas.

Mysql: possível erro em having

Enviado: 25 Jul 2020 22:51
por cjp
O campo cotacao não é zero. Verifiquei e estou postando foto para comprovar.

Mas mesmo que fosse, não seria o caso aqui, pois a soma que está errada é apenas da soma do campo compvenda, que deveria retornar 200 e está retornando 100.

Vou tentar explicar melhor.

A lista que pretendo é a do segundo anexo da minha mensagem anterior (não vou postar de novo para não lotar o site de anexos). Nessa lista, para o código PRLI11, está resultando quantidade=100, quando deveria resultar 200 (estou desprezando o último registro, pois ele é de 23/7/2020, data posterior à minha primeira postagem aqui; mas se considerar esse registro, deveria resultado 400, e continua resultando 100). Lembrando que quantidade é pra ser a soma apenas do campo compvenda.

As demais consultas que postei foram apenas para demonstrar como estão os registros na tabela.

Também vou postar agora a conta feita à mão, que resulta também no total de 200 (também desprezando o último registro).

Em suma, é evidente que tem algum erro no meu select. Não estou dizendo que o erro é do computador, ou do MySQL. É claro que o erro deve ser do select que eu fiz. E é por isso que estou pedindo ajuda, pois não sei o que estou fazendo errado.

Mysql: possível erro em having

Enviado: 26 Jul 2020 00:03
por JoséQuintas
o erro tá no pensamento kkkkk
tá pedindo o valor e querendo que saia o total
Pra nós, se tá pedindo o valor, sair o valor tá correto, já que só pede pra somar na outra coluna.
Nota: como a data atual aumentou, o resultado passou a ser 400
conta2.png
conta.png

Mysql: possível erro em having

Enviado: 26 Jul 2020 00:13
por JoséQuintas
Só comentário:

O que dificultou a resposta é que estávamos olhando o cálculo, já que a questão foi sobre o cálculo.

Quando mostrou no papel e caneta, facilitou entender do que estava falando.

Mysql: possível erro em having

Enviado: 26 Jul 2020 00:28
por JoséQuintas
Confirme o outro cálculo, é possível que tenha feito errado também, pelo mesmo motivo.
conta.png

Mysql: possível erro em having

Enviado: 26 Jul 2020 01:02
por cjp
Vc está certo. Deu certo agora. Obrigado.

Mysql: possível erro em having

Enviado: 26 Jul 2020 02:26
por JoséQuintas
Por muita coincidência estava mexendo num agora, com group e having.

Código: Selecionar todos

   WITH OBJECT cnSQL
      cSQLGroup := "LPAD( YEAR( LFDATLAN ), 4, '0' ), LPAD( MONTH( LFDATLAN ), 2, '0' )"
      IF nOpcTotais == 1
         cSQLGroup += ", LPAD( Day( LFDATLAN ), 2, '0' )"
      ENDIF
      cSQLGroup := "CONCAT_WS( '-', " + cSQLGroup + " )"
      :cSQL := "SELECT LFTIPLAN, " + cSQLGroup + " AS DATA, " + ;
         " SUM( LFVALCON ) AS VALCON, SUM( IF( LFICMVAL = 0, 0, LFICMBAS ) ) AS ICMBAS," + ;
         " SUM( LFICMVAL ) AS ICMVAL, SUM( LFICMOUT ) AS ICMOUT," + ;
         " SUM( IF( LFVALCON - LFICMBAS - LFICMOUT > 0, LFVALCON - LFICMBAS - LFICMOUT, 0 ) ) AS ICMISE," + ;
         " SUM( LFIPIVAL ) AS IPIVAL, SUM( IF( LFIPIVAL > 0, LFIPIBAS, 0 ) ) AS IPIBAS," + ;
         " SUM( IF( LFVALCON - LFIPIBAS - LFIPIOUT - LFIPIVAL > 0, LFVALCON - LFIPIBAS - LFIPIOUT - LFIPIVAL, 0 ) ) AS IPIISE," + ;
         " SUM( LFIPIOUT ) AS IPIOUT" + ;
         " FROM JPFISCAL" + ;
         " WHERE LFTIPLAN IN ( '1', '2' )"
      IF nOpcData == 2
         :cSQL += " AND LFDATLAN BETWEEN CAST( " + DateSQL( dDataInicial ) + " AS DATE )" + ;
            " AND CAST( " + DateSQL( dDataFinal ) + " AS DATE )"
      ENDIF
      IF nOpcGrf <> 1
         :cSQL += " AND LFGRF " + iif( nOpcGrf == 2, "=", "<>" ) + " 'S'"
      ENDIF
      :cSQL += " GROUP BY LFTIPLAN, " + cSQLGroup + ;
         " HAVING VALCON > 0" + ;
         " ORDER BY LFTIPLAN DESC, DATA"
      :Execute()
Esta parte é pra facilitar a construção do comando, porque se repete, é o total pela data, por dia ou por mês

Código: Selecionar todos

      cSQLGroup := "LPAD( YEAR( LFDATLAN ), 4, '0' ), LPAD( MONTH( LFDATLAN ), 2, '0' )"
      IF nOpcTotais == 1
         cSQLGroup += ", LPAD( Day( LFDATLAN ), 2, '0' )"
      ENDIF
      cSQLGroup := "CONCAT_WS( '-', " + cSQLGroup + " )"