none
Comparar campos de tabelas diferentes RRS feed

  • Pergunta

  • Bom dia! Tenho a seguinte situação: Tenho duas tabelas com campos em valores. Somando os valores, o total deve ser igual, porém, está dando diferença de centavos. Como faço para comparar esse campo das duas tabelas, onde eu possa ver em que lugar está a diferença? Segue um exemplo

    Tab1                                            Tab2
    Venda      Total                             Cliente             Total
    1               10                              1                      10
    2               20                              2                      20
    3               30                              3                      30
    4               40                              4                      40
    5               50                              5                      50

    Total geral = 150                           Total geral = 150

    Esse total geral não pode dar diferença, e como há muitas vendas eu ficaria uns 2 dias para comparar venda a venda das duas tabelas.

    sexta-feira, 24 de março de 2017 14:04

Respostas

  • Rodrigo,

    Estamos falando de qual versão do SQL Server?

    Se for abaixo do SQL Server 2012 poderia utilizar talvez o comando CASE em seu select para tentar comparar os campos, caso contrário a partir da versão 2012 podemos fazer uso do IIF dentro do Select.

    Mas acredito que este cenário esta ocorrendo devido alguma diferença na quantidade de casas decimais, ou até mesmo no que diz respeito as configurações regionais do Windows onde este SQL Server está instalado.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 27 de março de 2017 23:02

Todas as Respostas

  • Qual seria a relaçao entre a tab1 e a tab2? No seu exemplo nao fica claro. Poste aqui a verdadeira estrutura das duas tabelas.

    Normalmente o que é feito é fazer um left join e procurar pelos nulos, exemplo:

    select
       hdr.*
    from dbo.invHdr hdr (nolock)
    left join dbo.invDet det (nolock)
    on det.invnum = hdr.invnum
    where
       det.invnum is null

    fonte:https://sqlbyminh.wordpress.com/2009/04/24/detecting-orphaned-rows/

    att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 24 de março de 2017 14:32
  • Funciona assim. Tenho duas tabelas de vendas. Uma tabela (item) mostra todos os itens vendidos em cada venda. A outra tabela (venda), mostra o resumo de cada venda. Sendo assim, o total da somatória de todos os itens que estão na tabela (item) deve ser igual a somatória do valor total da tabela de resumo (venda). E o meu problema é que está dando alguns centavos de diferença, entre as tabelas item e venda.
    sexta-feira, 24 de março de 2017 15:10
  • Quem alimenta a tabela do resumo? Seu programa? pode ser que voce esteja aplicando um tipo errado de arredondamento. 

    Att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 24 de março de 2017 16:04
  • Veja como checar os valores entre vendas e itens:

    declare @venda table(idVenda int, valor decimal(10,1))
    declare @items table(idItens int, idVenda int, Item varchar(20), valor decimal(10,1))
    
    insert into @venda values(1, 300),(2, 400),(3, 500),(4, 1080)
    insert into @items values(1, 1, 'Item1', 100),(2, 1, 'Item2', 100),(3, 1, 'Item3', 100)
    insert into @items values(4, 2, 'Item1', 200),(5, 2, 'Item2', 150),(6, 2, 'Item3', 50.34)
    insert into @items values(7, 3, 'Item1', 150),(8, 3, 'Item2', 150),(9, 3, 'Item3', 200)
    insert into @items values(10, 4, 'Item1', 300),(11, 4, 'Item2', 350),(12, 4, 'Item3', 350.12)
    
    ;with cte as
    (select idVenda, sum(valor) valor
    from @items
    group by idVenda)
    select v.* from cte join @venda v on cte.idVenda = v.idVenda
    where cte.valor <> v.valor

    Identificando o padrão dos erros, com certeza achará a causa solução.

    Att,


    Antero Marques

    _______________________________________________________________________________

    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.


    sexta-feira, 24 de março de 2017 16:14
  • Deleted
    sexta-feira, 24 de março de 2017 16:56
  • Realmente a diferença pode estar relacionada à arredondamento e truncamento, mas o cliente usa SAT e o SAT arredonda, assim como o sistema. As colunas da tabela item na qual estou verificando o valor é val_líquido e na tabela venda também chama val_liquido.
    sexta-feira, 24 de março de 2017 17:09
  • Rodrigo,

    Estamos falando de qual versão do SQL Server?

    Se for abaixo do SQL Server 2012 poderia utilizar talvez o comando CASE em seu select para tentar comparar os campos, caso contrário a partir da versão 2012 podemos fazer uso do IIF dentro do Select.

    Mas acredito que este cenário esta ocorrendo devido alguma diferença na quantidade de casas decimais, ou até mesmo no que diz respeito as configurações regionais do Windows onde este SQL Server está instalado.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 27 de março de 2017 23:02