none
Query Sql RRS feed

  • Pergunta

  • Tenho a seguinte Situação

    tabela1

    numero da nota - cfop -          valor

    1                           1405            300

    2                           1102            200

    3                           1403            500

    tabela2

    numero da nota - cfop -          valor

    1                           1905            300

    2                           1102            200

    3                           1405             100

    Preciso fazer a comparação das 3 colunas das duas tabelas e depois mostrar a diferença existente entre elas

    Ex:

    nota 1 Divergência entre cfop plan1(1405) plan2(1905) e valores pla1(500) e plan2(300)

    nota 2 esta ok (sem divergência)

    Como eu possa montar isso no SQL Server 2005 ?

    Grato

    quinta-feira, 5 de julho de 2012 19:35

Respostas

  • Gildo,

    Fiz um exemplo bem simples, seja se te ajuda em algo..

    declare
    	@nota1 table (nr int, cfop int,valor decimal(17,2))
    declare
    	@nota2 table (nr int, cfop int,valor decimal(17,2))
    
    
    insert into @nota1 (nr, cfop, valor) values (1,1405,300)
    insert into @nota1 (nr, cfop, valor) values (2,1102,300)
    insert into @nota1 (nr, cfop, valor) values (3,1403,300)
    
    insert into @nota2 (nr, cfop, valor) values (1,1905,300)
    insert into @nota2 (nr, cfop, valor) values (2,1102,200)
    insert into @nota2 (nr, cfop, valor) values (3,1405,100)
    
    
    select 
    	a.nr,
    	difenca_cfop_nota1 = case when (a.cfop <> b.cfop) then a.cfop else 0 end,
    	difenca_cfop_nota2 = case when (a.cfop <> b.cfop) then b.cfop else 0 end,
    	difenca_valor_nota1 = case when (a.valor <> b.valor) then a.valor else 0 end,
    	difenca_valor_nota2 = case when (a.valor <> b.valor) then b.valor else 0 end
    
    from @nota1 a
    	inner join @nota2 b
    		on  a.nr = b.nr

    At.
    Rafael

    • Sugerido como Resposta Heloisa Pires terça-feira, 10 de julho de 2012 14:14
    • Marcado como Resposta Heloisa Pires terça-feira, 17 de julho de 2012 14:44
    quinta-feira, 5 de julho de 2012 20:45
  • Gildo, acho que a idéia do Rafael lhe atende.

    Talvez eu fizesse um pouquinho diferente o Select final. Em vez de comparar as CFOP's e os valores dentro do Case, faria left joins com a segunda tabela de documento. Acredito que seja um pouco mais performático, no caso de ter muitos dados nas tabelas.

    Usando a criação das tabelas do Rafael, segue exemplo:

    declare	@nota1 table (nr int, cfop int,valor decimal(17,2))
    declare	@nota2 table (nr int, cfop int,valor decimal(17,2))
    
    insert into @nota1 (nr, cfop, valor) values (1,1405,300), (2,1102,300), (3,1403,300)
    insert into @nota2 (nr, cfop, valor) values (1,1905,300), (2,1102,200), (3,1405,100)
    
    Select
      N1.nr,
      CFOP_Diferente  = Case When (N2.nr is Null) Then 'Sim' Else 'Não' End,
      Valor_Diferente = Case When (N3.nr is Null) Then 'Sim' Else 'Não' End
    From
      @nota1 N1 Left Join @nota2 N2 on (N1.nr = N2.nr) and (N1.cfop  = N2.cfop)
                Left Join @nota2 N3 on (N1.nr = N3.nr) and (N1.valor = N3.valor)


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta gildo_santos quarta-feira, 18 de julho de 2012 17:49
    sexta-feira, 6 de julho de 2012 01:31
    Moderador

Todas as Respostas

  • Gildo,

    Fiz um exemplo bem simples, seja se te ajuda em algo..

    declare
    	@nota1 table (nr int, cfop int,valor decimal(17,2))
    declare
    	@nota2 table (nr int, cfop int,valor decimal(17,2))
    
    
    insert into @nota1 (nr, cfop, valor) values (1,1405,300)
    insert into @nota1 (nr, cfop, valor) values (2,1102,300)
    insert into @nota1 (nr, cfop, valor) values (3,1403,300)
    
    insert into @nota2 (nr, cfop, valor) values (1,1905,300)
    insert into @nota2 (nr, cfop, valor) values (2,1102,200)
    insert into @nota2 (nr, cfop, valor) values (3,1405,100)
    
    
    select 
    	a.nr,
    	difenca_cfop_nota1 = case when (a.cfop <> b.cfop) then a.cfop else 0 end,
    	difenca_cfop_nota2 = case when (a.cfop <> b.cfop) then b.cfop else 0 end,
    	difenca_valor_nota1 = case when (a.valor <> b.valor) then a.valor else 0 end,
    	difenca_valor_nota2 = case when (a.valor <> b.valor) then b.valor else 0 end
    
    from @nota1 a
    	inner join @nota2 b
    		on  a.nr = b.nr

    At.
    Rafael

    • Sugerido como Resposta Heloisa Pires terça-feira, 10 de julho de 2012 14:14
    • Marcado como Resposta Heloisa Pires terça-feira, 17 de julho de 2012 14:44
    quinta-feira, 5 de julho de 2012 20:45
  • Gildo, acho que a idéia do Rafael lhe atende.

    Talvez eu fizesse um pouquinho diferente o Select final. Em vez de comparar as CFOP's e os valores dentro do Case, faria left joins com a segunda tabela de documento. Acredito que seja um pouco mais performático, no caso de ter muitos dados nas tabelas.

    Usando a criação das tabelas do Rafael, segue exemplo:

    declare	@nota1 table (nr int, cfop int,valor decimal(17,2))
    declare	@nota2 table (nr int, cfop int,valor decimal(17,2))
    
    insert into @nota1 (nr, cfop, valor) values (1,1405,300), (2,1102,300), (3,1403,300)
    insert into @nota2 (nr, cfop, valor) values (1,1905,300), (2,1102,200), (3,1405,100)
    
    Select
      N1.nr,
      CFOP_Diferente  = Case When (N2.nr is Null) Then 'Sim' Else 'Não' End,
      Valor_Diferente = Case When (N3.nr is Null) Then 'Sim' Else 'Não' End
    From
      @nota1 N1 Left Join @nota2 N2 on (N1.nr = N2.nr) and (N1.cfop  = N2.cfop)
                Left Join @nota2 N3 on (N1.nr = N3.nr) and (N1.valor = N3.valor)


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta gildo_santos quarta-feira, 18 de julho de 2012 17:49
    sexta-feira, 6 de julho de 2012 01:31
    Moderador
  • ok

    Obrigado

    Tem como melhorar essa query , para quando estiver uma nota em uma tabela e não estiver na outra tabela, apresentar uma aviso ?

    sexta-feira, 6 de julho de 2012 23:14
  • RAFAEL

    Bom dia

    Tem como melhorar essa query , para quando estiver uma nota em uma tabela e não estiver na outra tabela, apresentar uma mensagem  informando que na tabela 1 tem a nota 123  que não tem na tabela 2 ?

    Obrigado

    segunda-feira, 9 de julho de 2012 11:28
  • Você não pode votar em sua própria postagem
    0

    Roberson

    Bom dia

    Tem como melhorar essa query , para quando estiver uma nota em uma tabela e não estiver na outra tabela, apresentar uma mensagem  informando que na tabela 1 tem a nota 123  que não tem na tabela 2 ?

    Obrigado

    segunda-feira, 9 de julho de 2012 11:29
  • Boa tarde

    Você me ajudou a resolver um problema no forum da MSDN, mais eu ainda estou precisando de sua ajuda.

    Estou precisando melhorar essa query para que a pesquisa seja desse jeito:

    Na tabela 01 tem a nota 770 com cfop 1102 e o valor 845,99.. existe na tabela 02 essa mesma informação ?

                  01 tem a nota 770 com cfop 1403 e o valor 300,62 . existe na tabela 02 essa mesma informação ? caso não tenha mostra a diferença ou avisar.. tomando como base a tabela 01

    Tabela 01
                 data                        nota                    valor                         cfop        cnpj
    01/06/2012 7700 845,99 1102   12671651000192
    01/06/2012 7700 300,62 1403        12671651000192

    tabela 02

    01/06/2012 7700 845,99 1102        12671651000192
    01/06/2012 7700 300,62 1403   12671651000192
    quarta-feira, 18 de julho de 2012 18:21