Usuário com melhor resposta
Ajuda com um script

Pergunta
-
Boa tarde, estou tentando pegar dados de uma venda de um determinado período, no qual preciso dos dados, código do cliente, razão social e o valor da venda total em tal período. Portanto queria manter os clientes no resultado mesmo que não tenham venda nesse período selecionado.
exemplo:
select CLIEN.Codigo,CLIEN.Razao_Social,sum(NFSCB.Vlr_LiqItens)
from CLIEN
left join NFSCB on NFSCB.Cod_Cliente=CLIEN.Codigo
where NFSCB.Tip_Saida='V' and Dat_Emissao between '2015-01-01' and '2016-01-31' and clien.Codigo in
('7','29','33','57','99','117','153')
group by clien.Codigo,CLIEN.Razao_SocialNesse caso apenas adicionei 7 números de clientes, mas na verdade vou precisar de mais de 1000. No entanto quando o cliente não tem valor de venda ( sum(NFSCB.Vlr_LiqItens) ), ele não aparece no resultado.
Como posso manter o código do cliente e razão social no resultado e então o campo final sum(NFSCB.Vlr_LiqItens) como null ou zerado?
Muito Obrigado
Respostas
-
Acho que se está conforme o exemplo deveria funcionar.
De qualquer forma, segue outra sugestão utilizando uma subquery:
select CLIEN.Codigo, CLIEN.Razao_Social, (select sum(NFSCB.Vlr_LiqItens) from NFSCB where NFSCB.Cod_Cliente = CLIEN.Codigo and NFSCB.Tip_Saida = 'V' and Dat_Emissao between '2015-01-01' and '2016-01-31') from CLIEN where clien.Codigo in (1, 2, 3)
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ quinta-feira, 4 de fevereiro de 2016 17:24
-
select CLIEN.Codigo,CLIEN.Razao_Social,sum(ISNULL(NFSCB.Vlr_LiqItens,0)) from CLIEN left join NFSCB on NFSCB.Cod_Cliente=CLIEN.Codigo AND NFSCB.Tip_Saida='V' and Dat_Emissao between '2015-01-01' and '2016-01-31' and where clien.Codigo in ('7','29','33','57','99','117','153') group by clien.Codigo,CLIEN.Razao_Social
Tente dessa forma.
Se você colocar qualquer campo da segunda tabela no Where o LEFT JOIN acaba "virando" um "INNER JOIN"
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Marcado como Resposta Alan Neobras sexta-feira, 5 de fevereiro de 2016 16:34
Todas as Respostas
-
Boa tarde,
Experimente deixar a clausula Where da seguinte forma:
where clien.Codigo in ('7','29','33','57','99','117','153') and ( (NFSCB.Tip_Saida = 'V' and Dat_Emissao between '2015-01-01' and '2016-01-31') or (NFSCB.Cod_Cliente is null) )
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
Não sei se resolve seu problema, mas como uma alternativa, pode usar ISNULL ou COALESCE para tratar os nulos como Zero, por exemplo.
Referências:
https://msdn.microsoft.com/pt-br/library/ms184325%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396
https://msdn.microsoft.com/pt-br/library/ms190349(v=sql.120).aspx
-
Obrigado, mas infelizmente ja tive essa ideia até mesmo tentando usar outras colunas selecionando como null mas continua sem aparecer o resultado.
7 EDSON GUARAGNI E CIA LTDA 20102.8000
33 CARLA RIGONI E CIA. LTDA. 5712.8800
57 ROSSETO HENZ E CIA LTDA 27643.0500
99 C.L.I. FARMACIAS LTDA - FILIAL 11 19402.5000
117 DJ E DC FCIA REPRES COMERCIO LTDA 3716.4300
153 SCYLLA CONTE NUNES FACCIN 1402.2200esse seria o resultado, no qual o cliente com código 29 não aparece por não ter venda nesse período.
-
-
Você deixou os parênteses da forma como sugeri?
Experimente fazer um teste com o script abaixo através do SQL Server Management Studio:
declare @Clien table (Codigo int, Razao_Social varchar(40)); insert into @Clien values (1, 'abc'), (2, 'def'), (3, 'ghi'); declare @NFSCB table (Cod_Cliente int, Tip_Saida char, Dat_Emissao date, Vlr_LiqItens money); insert into @NFSCB values (1, 'V', '20150101', 100), (1, 'V', '20150102', 200), (3, 'V', '20150101', 500); select CLIEN.Codigo,CLIEN.Razao_Social,sum(NFSCB.Vlr_LiqItens) from @CLIEN as CLIEN left join @NFSCB as NFSCB on NFSCB.Cod_Cliente=CLIEN.Codigo where clien.Codigo in (1, 2, 3) and ( (NFSCB.Tip_Saida = 'V' and Dat_Emissao between '2015-01-01' and '2016-01-31') or (NFSCB.Cod_Cliente is null) ) group by CLIEN.Codigo, CLIEN.Razao_Social
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
-
Você deixou os parênteses da forma como sugeri?
Experimente fazer um teste com o script abaixo através do SQL Server Management Studio:
declare @Clien table (Codigo int, Razao_Social varchar(40)); insert into @Clien values (1, 'abc'), (2, 'def'), (3, 'ghi'); declare @NFSCB table (Cod_Cliente int, Tip_Saida char, Dat_Emissao date, Vlr_LiqItens money); insert into @NFSCB values (1, 'V', '20150101', 100), (1, 'V', '20150102', 200), (3, 'V', '20150101', 500); select CLIEN.Codigo,CLIEN.Razao_Social,sum(NFSCB.Vlr_LiqItens) from @CLIEN as CLIEN left join @NFSCB as NFSCB on NFSCB.Cod_Cliente=CLIEN.Codigo where clien.Codigo in (1, 2, 3) and ( (NFSCB.Tip_Saida = 'V' and Dat_Emissao between '2015-01-01' and '2016-01-31') or (NFSCB.Cod_Cliente is null) ) group by CLIEN.Codigo, CLIEN.Razao_Social
Espero que ajude
-
Você fez o teste do script que postei no SSMS?
Repare que não é inserida nenhuma linha para o cliente 2 ('def') na tabela NFSCB.
Esse cliente não apareceu no resultado?
O SQL Fiddle está instável, mas você também pode tentar verificar o resultado do teste abaixo:
http://sqlfiddle.com/#!3/bd8361/1
Assinatura: http://www.imoveisemexposicao.com.br
- Editado gapimex terça-feira, 2 de fevereiro de 2016 19:54
-
-
Acho que se está conforme o exemplo deveria funcionar.
De qualquer forma, segue outra sugestão utilizando uma subquery:
select CLIEN.Codigo, CLIEN.Razao_Social, (select sum(NFSCB.Vlr_LiqItens) from NFSCB where NFSCB.Cod_Cliente = CLIEN.Codigo and NFSCB.Tip_Saida = 'V' and Dat_Emissao between '2015-01-01' and '2016-01-31') from CLIEN where clien.Codigo in (1, 2, 3)
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ quinta-feira, 4 de fevereiro de 2016 17:24
-
select CLIEN.Codigo,CLIEN.Razao_Social,sum(ISNULL(NFSCB.Vlr_LiqItens,0)) from CLIEN left join NFSCB on NFSCB.Cod_Cliente=CLIEN.Codigo AND NFSCB.Tip_Saida='V' and Dat_Emissao between '2015-01-01' and '2016-01-31' and where clien.Codigo in ('7','29','33','57','99','117','153') group by clien.Codigo,CLIEN.Razao_Social
Tente dessa forma.
Se você colocar qualquer campo da segunda tabela no Where o LEFT JOIN acaba "virando" um "INNER JOIN"
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Marcado como Resposta Alan Neobras sexta-feira, 5 de fevereiro de 2016 16:34
-
select CLIEN.Codigo,CLIEN.Razao_Social,sum(ISNULL(NFSCB.Vlr_LiqItens,0)) from CLIEN left join NFSCB on NFSCB.Cod_Cliente=CLIEN.Codigo AND NFSCB.Tip_Saida='V' and Dat_Emissao between '2015-01-01' and '2016-01-31' and where clien.Codigo in ('7','29','33','57','99','117','153') group by clien.Codigo,CLIEN.Razao_Social
Tente dessa forma.
Se você colocar qualquer campo da segunda tabela no Where o LEFT JOIN acaba "virando" um "INNER JOIN"
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
Muito Obrigado, nessa forma funcionou.
Obrigado a outros que tentaram ajudar tambem