Retornar os dados como 0 caso não tenho registro no período
Galera estou tentando fazer um ranking de vendas na qual desejo que retorna a quantidade de vendas em dinheiro que o vendedor efetuou em cada mês no ano.
Há meses em que ele não efetuou nenhuma venda. Nesses meses em que ele não efetuou nenhuma venda, retornaria o valor 0 (zero) em VENDIDO.
Estou tentando efetuar esse retorno mas não estou conseguindo.
Segue o sql abaixo:
Exemplo do retorno:
NOME VENDIDO MES MES_NUMERIC
PEDRO 130.000,00 JANEIRO 1
PEDRO 0,00 FEVEREIRO 2
PEDRO 156.000,00 MARÇO 3
PEDRO 88.000,00 ABRIL 4
. . . .
. . . .
. . . .
Atenciosamente,
Marcelo Hakenhoar.
Há meses em que ele não efetuou nenhuma venda. Nesses meses em que ele não efetuou nenhuma venda, retornaria o valor 0 (zero) em VENDIDO.
Estou tentando efetuar esse retorno mas não estou conseguindo.
Segue o sql abaixo:
SELECT F.FUNC_NOME NOME, SUM(V.VDA_VALOR) VENDIDO, CASE EXTRACT (MONTH FROM V.VDA_DATA) WHEN 1 THEN TRIM('Janeiro') WHEN 2 THEN
'Fevereiro' WHEN 3 THEN 'Março' WHEN 4 THEN 'Abril' WHEN 5 THEN 'Maio' WHEN 6 THEN 'Junho' WHEN 7 THEN 'Julho' WHEN 8 THEN 'Agosto' WHEN 9
THEN 'Setembro' WHEN 10 THEN 'Outubro' WHEN 11 THEN 'Novembro' WHEN 12 THEN 'Dezembro' END AS MES, EXTRACT(MONTH FROM V.VDA_DATA)
AS MES_NUMERIC FROM VENDA V, VENDA_ITENS I, FUNCIONARIO F WHERE V.FUNC_ID = F.FUNC_ID AND V.VDA_ID = I.VDA_ID AND V.VDA_TIPODOC <> 'OR' AND
V.VDA_SITUACAO = 'RB' AND EXTRACT(MONTH FROM V.VDA_DATA) >= 1 AND EXTRACT(MONTH FROM V.VDA_DATA) <= 12 AND V.FUNC_ID = 43 AND
EXTRACT(YEAR FROM V.VDA_DATA) = 2013 GROUP BY NOME, MES, MES_NUMERIC ORDER BY MES_NUMERIC, VENDIDO DESC;Exemplo do retorno:
NOME VENDIDO MES MES_NUMERIC
PEDRO 130.000,00 JANEIRO 1
PEDRO 0,00 FEVEREIRO 2
PEDRO 156.000,00 MARÇO 3
PEDRO 88.000,00 ABRIL 4
. . . .
. . . .
. . . .
Atenciosamente,
Marcelo Hakenhoar.
Marcelo Hakenhoar
Curtidas 0
Respostas
Deivison Melo
22/11/2013
Você resolve isso com o comando: Coalesce...
Ficando:
Qualquer dúvida estou à disposição!
Ficando:
coalesce(VENDIDO,0)
SELECT F.FUNC_NOME NOME, SUM(V.VDA_VALOR) coalesce(VENDIDO,0) VENDIDO, CASE EXTRACT (MONTH FROM V.VDA_DATA) WHEN 1 THEN TRIM('Janeiro') WHEN 2 THEN
'Fevereiro' WHEN 3 THEN 'Março' WHEN 4 THEN 'Abril' WHEN 5 THEN 'Maio' WHEN 6 THEN 'Junho' WHEN 7 THEN 'Julho' WHEN 8 THEN 'Agosto' WHEN 9
THEN 'Setembro' WHEN 10 THEN 'Outubro' WHEN 11 THEN 'Novembro' WHEN 12 THEN 'Dezembro' END AS MES, EXTRACT(MONTH FROM V.VDA_DATA)
AS MES_NUMERIC FROM VENDA V, VENDA_ITENS I, FUNCIONARIO F WHERE V.FUNC_ID = F.FUNC_ID AND V.VDA_ID = I.VDA_ID AND V.VDA_TIPODOC <> 'OR' AND
V.VDA_SITUACAO = 'RB' AND EXTRACT(MONTH FROM V.VDA_DATA) >= 1 AND EXTRACT(MONTH FROM V.VDA_DATA) <= 12 AND V.FUNC_ID = 43 AND
EXTRACT(YEAR FROM V.VDA_DATA) = 2013 GROUP BY NOME, MES, MES_NUMERIC ORDER BY MES_NUMERIC, VENDIDO DESC;
Qualquer dúvida estou à disposição!
GOSTEI 0
Marcelo Hakenhoar
22/11/2013
Deivison, obrigado pela sua ajuda, mas quando eu coloquei o coalesce conforme você citou, deu erro no IBExpert apontando em cima do próprio comando coalesce.
GOSTEI 0
Deivison Melo
22/11/2013
Cara muito estranho isso!
Pois desde o firebird 1.5 eu uso esse comando e não tenho problemas!!
Qual a versão do seu firebird ?
Me manda a estrutura das tabelas e a query que eu ajusto aqui pra vc!
Muito estranho!
Verifica também a sintaxe!!
Pois desde o firebird 1.5 eu uso esse comando e não tenho problemas!!
Qual a versão do seu firebird ?
Me manda a estrutura das tabelas e a query que eu ajusto aqui pra vc!
Muito estranho!
Verifica também a sintaxe!!
GOSTEI 0
Marcelo Hakenhoar
22/11/2013
Ok Deivison, vou verificar a sintaxe do comando.
Estou fazendo um relatório de ranking de vendas conforme eu descrevi no tópico, no serviço na qual eu faço estagio. A versão que usam aqui do firebird é 2.5 e aqui só tem eu e o meu chefe como programador e ele esta viajando a negócio, não tendo como me ajudar aonde ele se encontra no momento.
Mais uma vez, obrigado pela sua ajuda.
Estou fazendo um relatório de ranking de vendas conforme eu descrevi no tópico, no serviço na qual eu faço estagio. A versão que usam aqui do firebird é 2.5 e aqui só tem eu e o meu chefe como programador e ele esta viajando a negócio, não tendo como me ajudar aonde ele se encontra no momento.
Mais uma vez, obrigado pela sua ajuda.
GOSTEI 0
Alex Lekao
22/11/2013
Oi Bom dia!!!
Nao sei se ele copiou o codigo na integra, mas ta faltando uma virgula antes do coalasce para separar os campos.
So para constar o que observei no codigo, caso ele tenha sido apenas copiado e colado sem fazer nenhum tipo de ajuste.
Nao sei se ele copiou o codigo na integra, mas ta faltando uma virgula antes do coalasce para separar os campos.
So para constar o que observei no codigo, caso ele tenha sido apenas copiado e colado sem fazer nenhum tipo de ajuste.
GOSTEI 0
Deivison Melo
22/11/2013
Apenas sugerir o comando, não validei código algum!!
Caso seja necessário farei isso sem problemas por isso pedir a estrutura das tabelas e toda a instrução SQL.
Abração e bons códigos!!!
Caso seja necessário farei isso sem problemas por isso pedir a estrutura das tabelas e toda a instrução SQL.
Abração e bons códigos!!!
GOSTEI 0
Marcelo Hakenhoar
22/11/2013
Alex, eu também tentei colocando a vírgula antes do coalesce e deu erro também.
Mas vou continuar verificando aqui as possibilidades.
Obrigado.
Mas vou continuar verificando aqui as possibilidades.
Obrigado.
GOSTEI 0
Alex Lekao
22/11/2013
posta o erro, de repende da uma luz maior para resolver.
GOSTEI 0
Marcelo Hakenhoar
22/11/2013
Alex, o IBExpert me retorna este erro quando uso o comando que o Deivison me informou:
E usando a vírgula antes do coalesce como você me informou me retornou este erro:
SELECT F.FUNC_NOME NOME, SUM(V.VDA_VALOR) coalesce(VENDIDO,0) VENDIDO, CASE EXTRACT (MONTH FROM V.VDA_DATA) WHEN 1 THEN TRIM('Janeiro') WHEN 2 THEN
'Fevereiro' WHEN 3 THEN 'Março' WHEN 4 THEN 'Abril' WHEN 5 THEN 'Maio' WHEN 6 THEN 'Junho' WHEN 7 THEN 'Julho' WHEN 8 THEN 'Agosto' WHEN 9
THEN 'Setembro' WHEN 10 THEN 'Outubro' WHEN 11 THEN 'Novembro' WHEN 12 THEN 'Dezembro' END AS MES, EXTRACT(MONTH FROM V.VDA_DATA)
AS MES_NUMERIC FROM VENDA V, VENDA_ITENS I, FUNCIONARIO F WHERE V.FUNC_ID = F.FUNC_ID AND V.VDA_ID = I.VDA_ID AND V.VDA_TIPODOC <> 'OR' AND
V.VDA_SITUACAO = 'RB' AND EXTRACT(MONTH FROM V.VDA_DATA) >= 1 AND EXTRACT(MONTH FROM V.VDA_DATA) <= 12 AND V.FUNC_ID = 43 AND
EXTRACT(YEAR FROM V.VDA_DATA) = 2013 GROUP BY NOME, MES, MES_NUMERIC ORDER BY MES_NUMERIC, VENDIDO DESC;
can't format message 13:896 -- message file C:\Windows\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, column 51.
(.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, column 51.
(.
E usando a vírgula antes do coalesce como você me informou me retornou este erro:
can't format message 13:794 -- message file C:\Windows\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
VENDIDO.
At line 1, column 53.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
VENDIDO.
At line 1, column 53.
GOSTEI 0
Alex Lekao
22/11/2013
Oi Marcelo, bom dia!!!
Tenta assim e ve se funciona.
Aparentemente eh por isso.
Faz um teste ai e coloca o resultado para a gente.
A mensagem de erro esta informando que nao tem um arquivo de mensagens e que a coluna vendido nao existe.
nesta sugestao que estou te dando vc substituir o sum e o coalasce por esse codigo e faz um teste.
Vamos ver se funciona.
Abraco.
Alex - Lekao
Tenta assim e ve se funciona.
coalesce(SUM(V.VDA_VALOR),0) VENDIDO
Aparentemente eh por isso.
Faz um teste ai e coloca o resultado para a gente.
A mensagem de erro esta informando que nao tem um arquivo de mensagens e que a coluna vendido nao existe.
nesta sugestao que estou te dando vc substituir o sum e o coalasce por esse codigo e faz um teste.
Vamos ver se funciona.
Abraco.
Alex - Lekao
GOSTEI 0
Marcelo Hakenhoar
22/11/2013
Alex, eu tentei e não retornou o valor zero em um dos meses em que uma vendedora não efetuou uma venda.
Mas acho que eu encontrei o erro e estaria no mês quando eu puxo ele. O sql não sabe definir qual o mês que ele pertence por não ter venda neste mês e por isso não retorna.
Bom, acho que é isso.
Mas acho que eu encontrei o erro e estaria no mês quando eu puxo ele. O sql não sabe definir qual o mês que ele pertence por não ter venda neste mês e por isso não retorna.
Bom, acho que é isso.
GOSTEI 0
Alex Lekao
22/11/2013
entendi...
mas os erros pararam de acontecer entao?
e esse ultimo script para tentar corrigir funcionou tbm ne?
vamos ver se conseguimos analisar mais alguma coisa no codigo para tentar contornar isso. rsrsr
mas os erros pararam de acontecer entao?
e esse ultimo script para tentar corrigir funcionou tbm ne?
vamos ver se conseguimos analisar mais alguma coisa no codigo para tentar contornar isso. rsrsr
GOSTEI 0
Deivison Melo
22/11/2013
Por favor, poste o ddl das tabelas (script´s) para criarmos essas tabelas e com isso podermos corrigir a sua query.
GOSTEI 0
Antonio Jesus
22/11/2013
Ola caro amigo!
Testei este script e funcionou perfeitamente, retornando zero.
100+
ANT.CAROS/SP
Testei este script e funcionou perfeitamente, retornando zero.
ELECT CODCLI, coalesce(SUM(VLTOTAL),0) as VLTOTAL FROM MOVENDA WHERE DTVENDA > '01.12.2013' GROUP BY CODCLI
100+
ANT.CAROS/SP
GOSTEI 0
Antonio Jesus
22/11/2013
Citação:
can't format message 13:794 -- message file C:\Windows\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
VENDIDO.
At line 1, column 53.
Quanto a esta mensagem, copie o arquivo "firebird.msg" que esta na pasta BIN do FireBird para a pasta do IBExpert, que resolve.
No seu código esta faltando os "as Vendido" coalesce(sum(valor),0) as VENDIDO
100+
ANT.CARLOS/SP
GOSTEI 0