Usuário com melhor resposta
Query Sql

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
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
-
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.brSe 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
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
-
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.brSe 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
-
-
-
-
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 01data nota valor cfop cnpj01/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