none
Ajuda com um script RRS feed

  • 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_Social

    Nesse 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

     

    terça-feira, 2 de fevereiro de 2016 17:39

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
    terça-feira, 2 de fevereiro de 2016 22:56
  • 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
    quarta-feira, 3 de fevereiro de 2016 10:51

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

    terça-feira, 2 de fevereiro de 2016 18:12
  • 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 

    terça-feira, 2 de fevereiro de 2016 18:19
  • 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.2200

    esse seria o resultado, no qual o cliente com código 29 não aparece por não ter venda nesse período.

    terça-feira, 2 de fevereiro de 2016 18:27
  • tentei usar os isnull e não consegui com ele, mas vou ler novamente para ver se consigo. Muito obrigado
    terça-feira, 2 de fevereiro de 2016 18:28
  • 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

    terça-feira, 2 de fevereiro de 2016 18:45
  • 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

    Sim, exatamente como me passou. Copiei e colei direto. Infelizmente o resultado saiu o mesmo.
    terça-feira, 2 de fevereiro de 2016 19:41
  • 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
    terça-feira, 2 de fevereiro de 2016 19:52
  • Sim, vi que no exemplo que você passou funcionou, mas com oque tento em meu SQL não funcionou, de qualquer forma, muito obrigado
    terça-feira, 2 de fevereiro de 2016 20:57
  • 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
    terça-feira, 2 de fevereiro de 2016 22:56
  • 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
    quarta-feira, 3 de fevereiro de 2016 10:51
  • 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

    sexta-feira, 5 de fevereiro de 2016 16:34