Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 ascVeja se istoajuda.
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
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
>
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.
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?
>
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.
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
>
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
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 ?
>
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.
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
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
>
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
Veja se istoajuda.