Inquiridor
Consulta com Lefth join

Pergunta
-
Amigos boa noite
Estou fazendo um query para ser usada dentro de uma aplicacao Protheus (TOTVS).
O problema e o seguinte. A consulta abaixo traz as vendas mes a mes de todos os clientes por vendedor. Acontece que preciso agoira que tambem ele traga tanto os clientes com vendas como os sem vendas. Ai e que o bicho ta pegando eu ja usei Left join e nao estou conseguindo o resultado desejado.
Se alguem puder me ajudar.
SELECT case WHEN MONTH(F2_EMISSAO)='01' THEN 'JAN' WHEN MONTH(F2_EMISSAO)='02' THEN 'FEV' WHEN MONTH(F2_EMISSAO)='03' THEN 'MAR' WHEN MONTH(F2_EMISSAO)='04' THEN 'ABR' WHEN MONTH(F2_EMISSAO)='05' THEN 'MAI' WHEN MONTH(F2_EMISSAO)='06' THEN 'JUN' WHEN MONTH(F2_EMISSAO)='07' THEN 'JUL' WHEN MONTH(F2_EMISSAO)='08' THEN 'AGO' WHEN MONTH(F2_EMISSAO)='09' THEN 'SET' WHEN MONTH(F2_EMISSAO)='10' THEN 'OUT' WHEN MONTH(F2_EMISSAO)='11' THEN 'NOV' ELSE 'DEZ' END AS MES, F2_CLIENTE, F2_LOJA, Sum(F2_VALFAT) F2_VALFAT, SUBSTRING(F2_EMISSAO,1,6) F2_MES, A1_NOME, A1_VEND, A1_MUN, A1_EST FROM SF2010 INNER JOIN SA1010 ON A1_COD = F2_CLIENTE AND A1_LOJA = F2_LOJA INNER JOIN SA3010 ON A3_COD = A1_VEND WHERE F2_FILIAL BETWEEN ' ' AND 'ZZ' AND SF2010.D_E_L_E_T_<>'*' AND F2_EMISSAO BETWEEN '20100101' AND '20100331' AND F2_TIPO = 'N' AND A1_COD_MUN BETWEEN ' ' AND 'ZZZZZZZ' AND A1_SATIV1 BETWEEN ' ' AND 'ZZZZZZ' AND F2_CLIENTE BETWEEN ' ' AND 'ZZZZZZ' AND F2_LOJA BETWEEN ' ' AND 'ZZ' AND A1_VEND BETWEEN '000020' AND '000020' GROUP BY F2_CLIENTE, F2_LOJA, A1_NOME, A1_VEND, A1_MUN, A1_EST, MONTH(F2_EMISSAO), SUBSTRING(F2_EMISSAO,1,6) HAVING SUM(F2_VALFAT) > 0 ORDER BY F2_CLIENTE
Fabricio
Todas as Respostas
-
Fabricio,
Realmente pelo que vc quer o uso do LEFT JOIN é o correto. Pois a questão estará na forma de relacionamento das suas tabelas no comando ON.
Me corrija se estou errado, mas parece que este banco não possue FK's, isso é controlado pela aplicação, certo?
Mas analise esta questão do relacionamento, acredito eu que encontraremos a solução do seu problema.
Att.,
Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo. -
Marco Antonio bom noite !!!
Nao a query e executada pelo banco direto a aplicacao so gera um arquivo temporario para uso do relatorio.
Na clausula ON estou usando as duas chaves que e codigo e loja do cliente.
Atenciosamente,
Fabricio Brandao
Fabricio -
-
Fabricio,
De que forma o SQL Server deverá analisar a existência ou não da venda?
O resultado que esta sendo gerado atualmente esta correto, então não seria o caso de tentar fazer um Union com a mesma estrutura de query mas trazendos o outro conjunto de resultado.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com] -
Union seria uma opção outra seria usar uma tabela mes com cross join conforme abaixo ...
declare
@cliente table(idCliente int, nome varchar(100))
declare
@vendas table(idCliente int, idVenda int, data datetime)
declare
@vendasDetalhe table(idVenda int, valor numeric(5,2))
insert
into @cliente values (1,'Cliente 001')
insert
into @cliente values (2,'Cliente 002')
insert
into @cliente values (3,'Cliente 003')
insert
into @vendas values (1,1,GETDATE() +1)
insert
into @vendas values (1,2,GETDATE() +35)
insert
into @vendas values (1,3,GETDATE() +60)
insert
into @vendas values (2,4,GETDATE() +1)
insert
into @vendas values (2,5,GETDATE() +35)
insert
into @vendas values (2,6,GETDATE() +60)
insert
into @vendasDetalhe values (1, 40)
insert
into @vendasDetalhe values (1, 20)
insert
into @vendasDetalhe values (2, 20)
insert
into @vendasDetalhe values (2, 60)
insert
into @vendasDetalhe values (3, 20)
insert
into @vendasDetalhe values (3, 65)
insert
into @vendasDetalhe values (4, 23)
insert
into @vendasDetalhe values (4, 65)
insert
into @vendasDetalhe values (5, 23)
insert
into @vendasDetalhe values (6, 65)
/*
@cliente table(@idCliente int, nome varchar(100))
@vendas table(@idCliente int, @idVenda int, data datetime)
@vendasDetalhe table(@idVenda int, valor numeric(3,0))
*/
declare
@mes table ( data datetime,valor numeric(5,2) default(0) )
insert
into @mes (data) values ('2011-01-15')
insert
into @mes (data) values ('2011-02-15')
insert
into @mes (data) values ('2011-03-15')
insert
into @mes (data) values ('2011-04-15')
insert
into @mes (data) values ('2011-05-15')
insert
into @mes (data) values ('2011-06-15')
insert
into @mes (data) values ('2011-07-15')
insert
into @mes (data) values ('2011-08-15')
insert
into @mes (data) values ('2011-09-15')
insert
into @mes (data) values ('2011-10-15')
insert
into @mes (data) values ('2011-11-15')
insert
into @mes (data) values ('2011-12-15')
select
nome,month(m.data), SUM(isnull(d.valor,0)) from @cliente c
cross
join @mes m
left
join @vendas v on v.idCliente = c.idcliente and MONTH(m.data) = MONTH(v.data)
left
join @vendasDetalhe d on d.idVenda = v.idVenda
group
by nome,month(m.data)
order
by nome
Marcelo - http://brmap.spaces.live.com/- Sugerido como Resposta Junior Galvão - MVPMVP domingo, 23 de janeiro de 2011 00:48