none
Campos totalizados com resultados errados RRS feed

  • Pergunta

  • Pessoal tenho o seguinte código abaixo que me retorna um grid com algumas operações de soma e totalização, porém em um dos cálculos o script está jogando os resultados muito acima dos esperados, por exemplo o campo qtde_ocorrencias em um dos registros era para mostrar 6 ocorrências mas ele retorna 30.

    Poderia ser algo nas junções das tabelas?

    SELECT
    	t1.cod_cli_for, t3.cidade, t2.nome_cadastro, t2.cpf_cgc, t2.rg_ie,
    	COUNT(t2.nome_cadastro) AS qtde_ocorrencias,
    	FORMAT(SUM(t1.valor_total), 'n', 'pt-br') AS valor_total_vendas,
    	FORMAT(SUM(t1.valor_total * 0.012), 'n', 'pt-br') AS previdencia,
    	FORMAT(SUM(t1.valor_total * 0.002), 'n', 'pt-br') AS senar,
    	FORMAT(SUM(t1.valor_total * 0.001), 'n', 'pt-br') AS gilrat
    FROM
    	tbentradas AS t1
    INNER JOIN
    	tbCadastroGeral AS t2 ON t1.cod_cli_for = t2.cod_cadastro
    INNER JOIN
    	tbendereco AS t3 ON t2.cod_cadastro = t3.cod_cadastro
    WHERE
    	t1.cod_tipo_mv in ('814', '816', '819', '821')
    	AND t1.cod_filial IN ('100', '116')
    	AND t1.data_v2 BETWEEN '2019-10-01' AND '2019-10-31'
    	AND t1.status <> 'c'
    GROUP BY
    	t1.cod_cli_for, t3.cidade, t2.nome_cadastro, t2.cpf_cgc, t2.rg_ie
    ORDER BY
    	t3.cidade ASC;


    segunda-feira, 4 de novembro de 2019 18:07

Respostas

  • Achei o erro, na terceira tabela no JOIN, no caso a tabela tbendereco, para cada fornecedor existem 5 registros iguais, apenas é diferente o valor do campo tipo_endereco. Reorganizei o script, e inclui mais um parâmetro no filtro, ficando da seguinte forma:

    SELECT
    	t1.cod_cadastro, t1.nome_cadastro, t3.cidade, t1.cpf_cgc, t1.rg_ie,
    	COUNT(t1.nome_cadastro) AS qtde_ocorrencias,
    	FORMAT(SUM(t2.valor_total), 'n', 'pt-br') AS valor_total_vendas,
    	FORMAT(SUM(t2.valor_total * 0.012), 'n', 'pt-br') AS previdencia,
    	FORMAT(SUM(t2.valor_total * 0.002), 'n', 'pt-br') AS senar,
    	FORMAT(SUM(t2.valor_total * 0.001), 'n', 'pt-br') AS gilrat
    FROM
    	tbcadastrogeral AS t1
    INNER JOIN
    	tbentradas AS t2 ON t1.cod_cadastro = t2.cod_cli_for
    INNER JOIN
    	tbendereco AS t3 ON t1.cod_cadastro = t3.cod_cadastro
    WHERE
    	t2.cod_tipo_mv IN ('814', '816', '819', '821')
    	AND t2.cod_filial = '100'
    	AND t2.status <> 'c'
    	AND t3.tipo_endereco = 'f'
    	AND t2.data_v2 BETWEEN '2019-10-01' AND '2019-10-31'
    GROUP BY
    	t1.cod_cadastro, t1.nome_cadastro, t3.cidade, t1.cpf_cgc, t1.rg_ie
    ORDER BY
    	t1.nome_cadastro ASC;

    Todos os cálculos estão corretos agora...

    segunda-feira, 4 de novembro de 2019 20:08

Todas as Respostas

  • Flávio, verifique se ao alterar
       COUNT(t2.nome_cadastro) AS qtde_ocorrencias,

    por
       COUNT(distinct t2.nome_cadastro) AS qtde_ocorrencias,

    você obtém o resultado desejado.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.


    • Editado José Diz segunda-feira, 4 de novembro de 2019 18:27
    segunda-feira, 4 de novembro de 2019 18:17
  • @José não deu certo. Ele retorna todos com qtde_ocorrencias igual a 1.

    

    Esse primeiro registro deve retornar 6 ocorrências.

    segunda-feira, 4 de novembro de 2019 18:25
  • Se para uma mesma linha de tbentradas podem existir várias linhas em tbCadastroGeral, talvez seja o caso de substituir

       COUNT(t2.nome_cadastro) AS qtde_ocorrencias,

    por
       COUNT(distinct t2.cod_cadastro) AS qtde_ocorrencias,

    ---

    A questão é encontrar qual é o critério de contagem que garanta o retorno do valor 6.

    Somente a coluna qtde_ocorrencias está errada ou outras também estão?


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 4 de novembro de 2019 18:33
    segunda-feira, 4 de novembro de 2019 18:27
  • Na verdade é o contrário, na tabela tbCadastroGeral tenho o fornecedor e na tabela tbentradas as suas vendas.
    segunda-feira, 4 de novembro de 2019 18:31
  • Na verdade é o contrário, na tabela tbCadastroGeral tenho o fornecedor e na tabela tbentradas as suas vendas.

    Ok.

    Então o objetivo é contar quantas linhas de tbentradas existem para cada tbCadastroGeral?

    Você pode isolar um caso, listar as linhas sem a acumulação e verificar quantas linhas existem usando a estrutura de seu código atual?

    Pode existir mais de um endereço para um mesmo fornecedor?

     

    -- código #1 v2
    SELECT t1.cod_cli_for, t3.cidade, t2.nome_cadastro, t2.cpf_cgc, t2.rg_ie, t1.valor_total
    FROM
    	tbentradas AS t1
    INNER JOIN
    	tbCadastroGeral AS t2 ON t1.cod_cli_for = t2.cod_cadastro
    INNER JOIN
    	tbendereco AS t3 ON t2.cod_cadastro = t3.cod_cadastro
    WHERE
    	t1.cod_tipo_mv in ('814', '816', '819', '821')
    	AND t1.cod_filial IN ('100', '116')
    	AND t1.data_v2 BETWEEN '2019-10-01' AND '2019-10-31'
    	AND t1.status <> 'c'
            and t1.cod_cli_for = '40153'     
    order by t1.cod_cli_for, t3.cidade, t2.nome_cadastro, t2.cpf_cgc, t2.rg_ie;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 4 de novembro de 2019 19:26
    segunda-feira, 4 de novembro de 2019 18:42
  • Se para uma mesma linha de tbentradas podem existir várias linhas em tbCadastroGeral, talvez seja o caso de substituir

       COUNT(t2.nome_cadastro) AS qtde_ocorrencias,

    por
       COUNT(distinct t2.cod_cadastro) AS qtde_ocorrencias,

    ---

    A questão é encontrar qual é o critério de contagem que garanta o retorno do valor 6.

    Somente a coluna qtde_ocorrencias está errada ou outras também estão?


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Todas as outras colunas estão erradas. Parece haver um loop fora do escopo. Quando a existirem 6 registros, emito um relatório via sistema para o fornecedor e tenho 6 vendas dele.

    segunda-feira, 4 de novembro de 2019 18:45
  • Usei o código abaixo:

    select * from tbEntradas where Cod_cli_for = '40153' and status <> 'c' AND cod_tipo_mv in ('814', '816', '819', '821') AND cod_filial IN ('100', '116') AND data_v2 BETWEEN '2019-10-01' AND '2019-10-31';

    E obtenho o seguinte grid de resultados:

    segunda-feira, 4 de novembro de 2019 19:08
  • E quantos endereços existem para cod_cadastro = '40153', na mesma cidade?

    Não é necessário utilizar também a coluna cod_filial na junção entre as tabelas tbCadastroGeral e  tbendereco e/ou entre tbEntradas e tbCadastroGeral?

    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 4 de novembro de 2019 19:52
    segunda-feira, 4 de novembro de 2019 19:46
  • Achei o erro, na terceira tabela no JOIN, no caso a tabela tbendereco, para cada fornecedor existem 5 registros iguais, apenas é diferente o valor do campo tipo_endereco. Reorganizei o script, e inclui mais um parâmetro no filtro, ficando da seguinte forma:

    SELECT
    	t1.cod_cadastro, t1.nome_cadastro, t3.cidade, t1.cpf_cgc, t1.rg_ie,
    	COUNT(t1.nome_cadastro) AS qtde_ocorrencias,
    	FORMAT(SUM(t2.valor_total), 'n', 'pt-br') AS valor_total_vendas,
    	FORMAT(SUM(t2.valor_total * 0.012), 'n', 'pt-br') AS previdencia,
    	FORMAT(SUM(t2.valor_total * 0.002), 'n', 'pt-br') AS senar,
    	FORMAT(SUM(t2.valor_total * 0.001), 'n', 'pt-br') AS gilrat
    FROM
    	tbcadastrogeral AS t1
    INNER JOIN
    	tbentradas AS t2 ON t1.cod_cadastro = t2.cod_cli_for
    INNER JOIN
    	tbendereco AS t3 ON t1.cod_cadastro = t3.cod_cadastro
    WHERE
    	t2.cod_tipo_mv IN ('814', '816', '819', '821')
    	AND t2.cod_filial = '100'
    	AND t2.status <> 'c'
    	AND t3.tipo_endereco = 'f'
    	AND t2.data_v2 BETWEEN '2019-10-01' AND '2019-10-31'
    GROUP BY
    	t1.cod_cadastro, t1.nome_cadastro, t3.cidade, t1.cpf_cgc, t1.rg_ie
    ORDER BY
    	t1.nome_cadastro ASC;

    Todos os cálculos estão corretos agora...

    segunda-feira, 4 de novembro de 2019 20:08
  • Achei o erro, na terceira tabela no JOIN, no caso a tabela tbendereco, para cada fornecedor existem 5 registros iguais,

    Perfeito Flávio, era disso que suspeitava: que haveriam 5 linhas para o fornecedor '40153', pois 30 / 6 = 5.  Eu pensei que fossem endereços diferentes (um para cada filial, por exemplo) mas pelo que você comenta há 5 endereços por cada fornecedor e não só para o '40153'.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 4 de novembro de 2019 23:07
    segunda-feira, 4 de novembro de 2019 22:44
  • Achei o erro, na terceira tabela no JOIN, no caso a tabela tbendereco, para cada fornecedor existem 5 registros iguais,

    Perfeito Flávio, era disso que suspeitava: que haveriam 5 linhas para o fornecedor '40153', pois 30 / 6 = 5.  Eu pensei que fossem endereços diferentes (um para cada filial, por exemplo) mas pelo que você comenta há 5 endereços por cada fornecedor e não só para o '40153'.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Isso mesmo. 5 endereços diferentes para cada fornecedor, tipo faturamento, entrega, cobrança etc.
    terça-feira, 5 de novembro de 2019 01:12