Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

diigaumrodrigo

Exibir valor como 0 se não existir

Recommended Posts

Bom dia pessoal.

Estou com uma dúvida, na verdade não sei se tem a possibilidade de se fazer o que quero.

Tenho duas tabelas, uma delas tem o nome de unidades de negócio, e outra é uma tabela de faturamento onde tem o nome dos representantes e a unidade de negócio referente ao que eles venderam.

Quero fazer uma consulta onde me retorne todas a unidades e o valor da venda dos representantes.

Exemplo.

Tenho as unidades 10 - 20 - 30 - 40 - 50 - 60.
O Representante vendeu nas unidades - 20 - 40.

A consulta tem que retornar todas as unidades, e onde o representante não vender vem como 0, e nas que ele vendeu vem com o valor.

Fiz o select normal, porém só me traz o que ele vendeu. 20-40

SELECT tr.`cod-representante` , `nome`, estado, cod_unidade un, sum(`vl-contabil`) valor
FROM faturamento_global fg
INNER JOIN tb_representantes tr on fg.`cod-representante`= tr.`cod-representante`
INNER JOIN unidade_negocio ug on ug.cod_unidade = fg.`cod_unidade`
where `data-estat` between '2014-01-01' and '2014-12-31'
and `cod_unidade` between 10 and 60
and tr.`cod-representante` = 1
group by tr.`cod-rep`, `cod_unidade` order by nome,un asc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se isto ajuda.

 

Tentei implementar com a minha aplicação, mas não consegui não.

 

Não entendi muito bem o conceito do que foi passado.

Consegue esboçar um exemplo de como eu utilizaria utilizando o meu SQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra solução

 

Um outro problema é que você parte de faturamento_global que nem sempre existe ,

parta de tb_representantes fazendo outer join com faturamento_global

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra solução

 

Um outro problema é que você parte de faturamento_global que nem sempre existe ,

parta de tb_representantes fazendo outer join com faturamento_global

 

Não rolou também.

Fiz um outro teste mais simples pra ver se retornava usando o LEFT OUTER JOIN

SELECT `cod_unidade`
FROM unidade_negocio un
LEFT OUTER JOIN faturamento_global fg on un.`cod_unidade` = fg.`cod_unidade`
where `data-estat` between '2014-01-01' and '2014-12-31'
and `cod_unidade` between '010' and '220'
group by `cod_unidade`

Era pra ele trazer todos os valores de unidade_negocio até 220. Sendo que na tabela faturamento_global só vai ter valores no máximo até 090.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca utilizei este OUTER JOIN, nunca consegui e sempre resolvi com LEFT JOIN, por isso nunca me aprofundei no OUTER.

 

 

O campo `cod_unidade` aceita letras também?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca utilizei este OUTER JOIN, nunca consegui e sempre resolvi com LEFT JOIN, por isso nunca me aprofundei no OUTER.

 

 

O campo `cod_unidade` aceita letras também?

 

O campo é um varchar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A "solução 1" seria algo assim

select cod-representante  , nome , estado, cod_unidade  , sum(valor) valor
from
(
SELECT tr.`cod-representante` , `nome`, estado, cod_unidade un, sum(`vl-contabil`) valor
FROM faturamento_global fg
INNER JOIN tb_representantes tr on fg.`cod-representante`= tr.`cod-representante`
INNER JOIN unidade_negocio ug on ug.cod_unidade = fg.`cod_unidade`
where `data-estat` between '2014-01-01' and '2014-12-31'
and `cod_unidade` between 10 and 60
and tr.`cod-representante` = 1
group by tr.`cod-rep`, `cod_unidade` order by nome,un asc
union all
SELECT ug.`cod-representante` , `nome`, estado, cod_unidade un, 0 valor
from tb_representantes tb
INNER JOIN unidade_negocio ug on ug.cod_unidade = tb.`cod_unidade` --supondo este relacionamento
where `cod_unidade` between 10 and 60
and tr.`cod-representante` = 1
)
group by cod-representante  , nome , estado, cod_unidade

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

A "solução 1" seria algo assim

select cod-representante  , nome , estado, cod_unidade  , sum(valor) valor
from
(
SELECT tr.`cod-representante` , `nome`, estado, cod_unidade un, sum(`vl-contabil`) valor
FROM faturamento_global fg
INNER JOIN tb_representantes tr on fg.`cod-representante`= tr.`cod-representante`
INNER JOIN unidade_negocio ug on ug.cod_unidade = fg.`cod_unidade`
where `data-estat` between '2014-01-01' and '2014-12-31'
and `cod_unidade` between 10 and 60
and tr.`cod-representante` = 1
group by tr.`cod-rep`, `cod_unidade` order by nome,un asc
union all
SELECT ug.`cod-representante` , `nome`, estado, cod_unidade un, 0 valor
from tb_representantes tb
INNER JOIN unidade_negocio ug on ug.cod_unidade = tb.`cod_unidade` --supondo este relacionamento
where `cod_unidade` between 10 and 60
and tr.`cod-representante` = 1
)
group by cod-representante  , nome , estado, cod_unidade

 

Não funcionou também.

 

Vou mostrar melhor como está as tabelas.

 

tb_representantes { cod-rep / nome / estado }

Ex. 1 - João - SP

 

faturamento_global {cod-rep(referencia cod-rep) / char-1(referencia cod_unidade) / vl-contabil/ data-estat)

Ex.

1 - 10 - 1.000

1 - 20 - 2.000

1 - 10 - 500

1 - 40 - 100

 

unidade_negocio{cod_unidade / descricao}

Ex.

10 - A

20 - B

30 - C

40 - D

50 - E

 

O select era pra retornar:

 

1 - 10 - 1.000

1 - 20 - 2.000

1 - 10 - 500

1 - 40 - 100

1 - 30 - 0(NULL)

1 - 50 - 0(NULL)

 

Mas ele continua só retornando os que coincidem. Segue abaixo.

select `cod-rep`, nome , estado, un, sum(valor) valor
from
(
SELECT tr.`cod-rep` , `nome`, estado, cod_unidade un, sum(`vl-contabil`) valor
FROM faturamento_global fg
INNER JOIN tb_representantes tr on fg.`cod-rep`= tr.`cod-rep`
INNER JOIN unidade_negocio ug on ug.cod_unidade = fg.`char-1`
where `cod_unidade` between '010' and '095'
and `data-estat` between '2015-03-01' and '2015-03-31'
and tr.`cod-rep` = 29
group by tr.`cod-rep`, `cod_unidade`

union all

SELECT tr.`cod-rep` , `nome`, `estado`, `cod_unidade` un, 0 valor
from tb_representantes tr
INNER JOIN faturamento_global fg on tr.`cod-rep` = fg.`cod-rep`
INNER JOIN unidade_negocio ug on ug.cod_unidade = fg.`char-1`
where `cod_unidade` between '010' and '095'
and tr.`cod-rep` = 29


) tabela_virtual

group by `cod-rep`, un

Compartilhar este post


Link para o post
Compartilhar em outros sites

union all

SELECT tr.`cod-rep` , `nome`, `estado`, `cod_unidade` un, 0 valor
from tb_representantes tr
INNER JOIN faturamento_global fg on tr.`cod-rep` = fg.`cod-rep`

este join "mata" pois não tem faturamento , não chame esta tabela , ela é o problema

 

tb_representantes e unidade_negocio tem algum relacionamento ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

union all

 

SELECT tr.`cod-rep` , `nome`, `estado`, `cod_unidade` un, 0 valor

from tb_representantes tr

INNER JOIN faturamento_global fg on tr.`cod-rep` = fg.`cod-rep`

 

este join "mata" pois não tem faturamento , não chame esta tabela , ela é o problema

 

tb_representantes e unidade_negocio tem algum relacionamento ?

 

Elas não possuem relacionamento. A tabela faturamento_global é único jeito delas conversarem. Se eu tirar não tem como eu relacionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Forçando um Produto Cartesiano ...

select `cod-rep`, nome , estado, un, sum(valor) valor
from
(
SELECT tr.`cod-rep` , `nome`, estado, cod_unidade un, sum(`vl-contabil`) valor
FROM faturamento_global fg
INNER JOIN tb_representantes tr on fg.`cod-rep`= tr.`cod-rep`
INNER JOIN unidade_negocio ug on ug.cod_unidade = fg.`char-1`
where `cod_unidade` between '010' and '095'
and `data-estat` between '2015-03-01' and '2015-03-31'
and tr.`cod-rep` = 29
group by tr.`cod-rep`, `cod_unidade`
union all
SELECT tr.`cod-rep` , `nome`, `estado`, `cod_unidade` un, 0 valor
from tb_representantes tr , unidade_negocio ug
where `cod_unidade` between '010' and '095'
and tr.`cod-rep` = 29
) 
tabela_virtual
group by `cod-rep`, un

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT tr.`cod-rep` , `nome`, estado, cod_unidade un, sum(`vl-contabil`) valor
FROM unidade_negocio ug
LEFT JOIN faturamento_global fg
  ON ug.cod_unidade = fg.`char-1`
LEFT JOIN tb_representantes tr
  ON fg.`cod-rep`= tr.`cod-rep`
WHERE `cod_unidade` between '010' and '095'
  AND `data-estat` between '2015-03-01' and '2015-03-31'
  AND tr.`cod-rep` = 29
GROUP BY tr.`cod-rep`, `cod_unidade`

O INNER JOIN só retorna o que possui relacionamento, o LEFT JOIN deve solucionar, veja também que reordenei as tabelas conforme a dica do @Motta, porém, trouxe primeiro a tabela de `unidade_negocio`.

 

 

Outra solução

 

Um outro problema é que você parte de faturamento_global que nem sempre existe ,

parta de tb_representantes fazendo outer join com faturamento_global

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Forçando um Produto Cartesiano ...

select `cod-rep`, nome , estado, un, sum(valor) valor
from
(
SELECT tr.`cod-rep` , `nome`, estado, cod_unidade un, sum(`vl-contabil`) valor
FROM faturamento_global fg
INNER JOIN tb_representantes tr on fg.`cod-rep`= tr.`cod-rep`
INNER JOIN unidade_negocio ug on ug.cod_unidade = fg.`char-1`
where `cod_unidade` between '010' and '095'
and `data-estat` between '2015-03-01' and '2015-03-31'
and tr.`cod-rep` = 29
group by tr.`cod-rep`, `cod_unidade`
union all
SELECT tr.`cod-rep` , `nome`, `estado`, `cod_unidade` un, 0 valor
from tb_representantes tr , unidade_negocio ug
where `cod_unidade` between '010' and '095'
and tr.`cod-rep` = 29
) 
tabela_virtual
group by `cod-rep`, un

 

Muito obrigado Motta, como sempre resolvendo meus problemas.. Valeu mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.