none
Query Com vinculos e dados Null RRS feed

  • Pergunta

  • Preciso montar uma Query, onde totaliza as vendas por famílias de produtos.
    Porém não posso usar o INNER JOIN, pois preciso mostrar as famílias que não tiveram venda.

    Com o LEFT JOIN  não deu certo, pois preciso filtrar a data da venda, e na condição WHERE ele anula as famílias que não tiveram venda.

    SELECT
     
     , FAMILIA.COD AS FAMILIA
     ,REPLACE(CONVERT(DECIMAL(10,2), SUM(LINHAVENDA.VALOR)),'.',',') AS 'VALOR'
     , MOEDA.COD AS MOEDA 
    FROM FAMILIA (NOLOCK)
      INNER JOIN PRODUTO (NOLOCK) ON FAMILIA.UKEY = PRODUTO.FAMILIA_UKEY
      LEFT JOIN LINHAVENDA (NOLOCK) ON PRODUTO.UKEY = LINHAVENDA.PRODUTO_UKEY
      LEFT JOIN VENDA (NOLOCK) ON VENDA.UKEY = LINHAVENDA.VENDA_UKEY
      LEFT JOIN MOEDA (NOLOCK) ON LEFT(VENDA.A36_CODE,5) = MOEDA.A36_UKEY
      
    WHERE
      FAMILIA.COD LIKE ('1%')
     
      AND VENDA.DATAVENDA BETWEEN @DATA AND @DATA2 
         AND LINHAVENDA.VALORFINANCEIRO > 0
    GROUP BY 
      
       FAMILIA.COD
        ,MOEDA.COD
    ORDER BY FAMILIA.COD

    quarta-feira, 12 de julho de 2017 18:55

Respostas

Todas as Respostas

  • Boa tarde,

    William, experimente utilizar o Left Join com a condição da seguinte forma:

    AND (VENDA.DATAVENDA BETWEEN @DATA AND @DATA2 OR VENDA.DATAVENDA IS NULL)

    obs: talvez seja necessário deixar a condição com a coluna ValorFinanceiro da mesma forma

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 12 de julho de 2017 19:07
  •  Não trouxe todas as familias
    quarta-feira, 12 de julho de 2017 19:22
  • Você fez a mesma alteração na outra condição que citei?

    WHERE 
      FAMILIA.COD LIKE ('1%') 
      AND (VENDA.DATAVENDA BETWEEN @DATA AND @DATA2 OR VENDA.DATAVENDA IS NULL) 
      AND (LINHAVENDA.VALORFINANCEIRO > 0 OR LINHAVENDA.VALORFINANCEIRO IS NULL)


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 12 de julho de 2017 19:29
  • tenta assim

    SELECT  FAMILIA.COD AS FAMILIA ,
            REPLACE(CONVERT(DECIMAL(10, 2), SUM(LINHAVENDA.VALOR)), '.', ',') AS 'VALOR' ,
            MOEDA.COD AS MOEDA
    FROM    FAMILIA (NOLOCK)
            INNER JOIN PRODUTO (NOLOCK) ON FAMILIA.UKEY = PRODUTO.FAMILIA_UKEY
            LEFT JOIN LINHAVENDA (NOLOCK) ON PRODUTO.UKEY = LINHAVENDA.PRODUTO_UKEY
            LEFT JOIN VENDA (NOLOCK) ON VENDA.UKEY = LINHAVENDA.VENDA_UKEY
            LEFT JOIN MOEDA (NOLOCK) ON LEFT(VENDA.A36_CODE, 5) = MOEDA.A36_UKEY
    WHERE   FAMILIA.COD LIKE ( '1%' )
            AND 
    		(
    		VENDA.DATAVENDA BETWEEN @DATA AND @DATA2
    		OR (
    		    VENDA.DATAVENDA IS NULL
    		  )
    		)
            AND LINHAVENDA.VALORFINANCEIRO > 0
    GROUP BY FAMILIA.COD ,
            MOEDA.COD
    ORDER BY FAMILIA.COD;


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"




    Wesley Neves

    quarta-feira, 12 de julho de 2017 19:29
  • Assim ele trouxe todas as famílias, mas as famílias que tem vendas, ele altera o valor, ou seja, somou com vendas antigas
    quarta-feira, 12 de julho de 2017 19:59
  • Tive que fazer na outra condição também, porém, o valor da venda veio diferente, pois somou com talvez uma venda que esteja sem a data.
    quarta-feira, 12 de julho de 2017 20:00
  • Experimente trocar a coluna utilizada depois do Or por uma coluna que pertence a mesma tabela e não aceita null. Ex:

    WHERE 
      FAMILIA.COD LIKE ('1%') 
      AND (VENDA.DATAVENDA BETWEEN @DATA AND @DATA2 OR VENDA.UKEY IS NULL) 
      AND (LINHAVENDA.VALORFINANCEIRO > 0 OR LINHAVENDA.UKEY IS NULL)

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 12 de julho de 2017 20:09
  • Deu certo, porém estou tendo problemas com a moeda, existe venda que o campo moeda esta em branco.
    Então a linha de produto duplica,  um exibe a moeda e no outro como NULL. 

    Não queria partir para um SUBSelect , mas acredito que se eu selecionar as famílias e com subselect consigo pegar o total de vendas no período escolhido.
    quinta-feira, 13 de julho de 2017 13:54
  • Mas e se existirem por exemplo linhas em que a coluna moeda está igual a R$, US$ e null?

    Essas linhas com null seriam agrupadas com qual moeda?

    Não é possível corrigir as linhas em que a coluna moeda está null?


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 13 de julho de 2017 14:24
  • Deleted
    sexta-feira, 14 de julho de 2017 00:59
  • Boa tarde.

    Filtrando a data das vendas na cláusula ON do left join com vendas não funcionou?

    Segue script.

    SELECT
     
     , FAMILIA.COD AS FAMILIA
     ,REPLACE(CONVERT(DECIMAL(10,2), SUM(LINHAVENDA.VALOR)),'.',',') AS 'VALOR' 
     , MOEDA.COD AS MOEDA 
    FROM FAMILIA (NOLOCK)
      INNER JOIN PRODUTO (NOLOCK) ON FAMILIA.UKEY = PRODUTO.FAMILIA_UKEY 
      LEFT JOIN LINHAVENDA (NOLOCK) ON PRODUTO.UKEY = LINHAVENDA.PRODUTO_UKEY 
      LEFT JOIN VENDA (NOLOCK) ON VENDA.UKEY = LINHAVENDA.VENDA_UKEY AND VENDA.DATAVENDA BETWEEN @DATA AND @DATA2  
      LEFT JOIN MOEDA (NOLOCK) ON LEFT(VENDA.A36_CODE,5) = MOEDA.A36_UKEY
      
    WHERE 
      FAMILIA.COD LIKE ('1%')  AND LINHAVENDA.VALORFINANCEIRO > 0
    GROUP BY 
      
       FAMILIA.COD
        ,MOEDA.COD
    ORDER BY FAMILIA.COD



    Vinicius Fonseca
    MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation
    CBD CONSULTORIA

    sexta-feira, 14 de julho de 2017 16:33
  • Bom dia,

    Por falta de retorno, essa thread está sendo encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,


    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 17 de julho de 2017 13:10
    Moderador