none
Consulta com Lefth join RRS feed

  • 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
    terça-feira, 28 de dezembro de 2010 21:35

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.
    terça-feira, 28 de dezembro de 2010 22:56
  • 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
    terça-feira, 28 de dezembro de 2010 22:59
  • Vc conseguiria postar um exemplo de como está vindo e como deveria ser?

     


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    terça-feira, 28 de dezembro de 2010 23:08
  • 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]
    terça-feira, 28 de dezembro de 2010 23:58
  • 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/
    sábado, 15 de janeiro de 2011 01:06