Usuário com melhor resposta
Query Com vinculos e dados Null

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 > 0GROUP BY
FAMILIA.COD
,MOEDA.COD
ORDER BY FAMILIA.COD
Respostas
-
Deleted
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 17 de julho de 2017 13:10
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
-
-
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
-
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
-
-
-
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
-
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. -
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
-
Deleted
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 17 de julho de 2017 13:10
-
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 -
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.