none
CTE - Subquery RRS feed

  • Pergunta

  • Pessoal, boa tarde.

    Tenho uma query, onde preciso trazer informações de vendas e os respectivos budgets.
    O problema que tenho é, quando não há venda para determinado cliente, o budget não aparece na coluna.
    Achei que usando os CTE's da vida, daria certo, mas, infelizmente não consegui.
    Alguém ja teve algo semelhante e poderia me ajudar?
    Obrigado!

    with CTE_Budgetds as
    (select 
    CodCliente,
    Ano,
    Mes,
    CodItem,
    SUM(b.valorprev) as budget,
    SUM(b.meta) as budgetkg 
    from budgetds b 
    group by CodCliente, Ano, Mes, CodItem) 
    SELECT s.AnoFrances, 
    coalesce(s.ano, b.ano) as ano, 
    s.TrimFrances, 
    coalesce(s.Mes, b.mes) as mes, 
    s.Supervisor, 
    coalesce(s.CodCLiente, b.CodCliente) as CodCliente, 
    s.NomeCliente, 
    s.Estado, 
    s.CategProd, 
    s.GrupoProd, 
    s.LinhaProd, 
    s.NomePadrao, 
    coalesce(s.CodItem, b.CodItem) as CodItem, 
    s.Item, 
    s.Composicao, 
    s.DocEntry, 
    s.NF, 
    s.Utilizacao, 
    s.CFOP, 
    s.IPI, 
    s.TotalImpostos, 
    s.CustoProd, 
    s.CustoUnit, 
    s.Qtde, 
    s.Preço, 
    s.VlrTotal,
    s.VlReal, 
    s.CustoTotal, 
    b.budget, 
    b.budgetkg 
    FROM SALESMAP as s 
    full join CTE_Budgetds as b on b.CodCLiente = s.CodCLiente and b.ano = s.ano and b.mes = s.mes and b.CodItem = s.CodItem WHERE s.DOCDATE >= '2021-09-01' and s.DOCDATE <= '2021-09-30'

    sexta-feira, 17 de setembro de 2021 20:02

Todas as Respostas

  • Boa tarde,

    Experimente deixar o Where da seguinte forma:

    WHERE 
        (s.DOCDATE >= '2021-09-01' and s.DOCDATE <= '2021-09-30') or
        (s.DOCDATE is null)

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sábado, 18 de setembro de 2021 17:29
  • Bom dia amigo, obrigado pela ajuda.

    Ainda assim não funcionou...quando não existe venda para o cliente ele não traz os dados infelizmente.
    Porém, se eu desvincular o cliente no where, ele também fica incorreto, pois traz todos erroneamente =/

    segunda-feira, 20 de setembro de 2021 10:50

  • Porém, se eu desvincular o cliente no where, ele também fica incorreto, pois traz todos erroneamente =/


    Bom dia,

    Não entendi o que você disse acima, pelo que vi a coluna cliente não está sendo utilizada no Where.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 20 de setembro de 2021 13:20
  • Sim, amigo. Utilizo apenas o código, pq acredito que o nome do cliente ja deveria vir associado.
    Coloquei a data null, mas por exemplo, tenho um cliente budget diversos...ele não teve vendas mas tem budget, e, não os traz na consulta =/

    FROM SALESMAP as s 
    full join CTE_Budgetds as b on b.CodCLiente = s.CodCLiente and b.ano = s.ano and b.mes = s.mes and b.CodItem = s.CodItem WHERE 
    (s.DOCDATE >= '2021-09-01' and s.DOCDATE <= '2021-09-30' or
        (s.DOCDATE is null))

    segunda-feira, 20 de setembro de 2021 14:43
  • Mateus,

    Inicialmente se você filtrar somente pelo período de datas conforme 

    s.DOCDATE >= '2021-09-01' and s.DOCDATE <= '2021-09-30'

    O que é retornado?

    As condições aplicadas ao seu operador Full Join, são válidas:

    FROM SALESMAP as s full join CTE_Budgetds as b
    on b.CodCLiente = s.CodCLiente
    and b.ano = s.ano
    and b.mes = s.mes
    and b.CodItem = s.CodItem

    Parece-me que condições relacionadas ao ANO e Mes são conflitantes para a condição aplicada ao Where.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 21 de setembro de 2021 00:13
  • Mateus, pelo que vi na imagem você acrescentou um filtro em relação a consulta que postou aqui. Experimente dessa forma:

    WHERE 
        (s.DOCDATE >= '2021-09-01' and s.DOCDATE <= '2021-09-30' and s.CodItem = '7047') or
        (s.DOCDATE is null)

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 21 de setembro de 2021 12:28
  • Obrigado pelo auxilio pessoal.

    Infelizmente, ainda não deu certo.
    A questão de eu colocar a data é que, por exemplo, eu gostaria de trazer todas as vendas do mês x budget do mês.
    O problema está que, quando não há venda para um determinado cliente, o budget não é trazido.
    Na tabela de budget não há data específica, mas mês/ano sim.
    Quando coloco data = null ele traz milhares de linhas em branco.
    Abaixo segue imagem dos scripts das 2 tabelas que preciso unir. Não sei realmente se será possível.
    Agradeço mesmo a disponibilidade de ajuda de todos!

    terça-feira, 21 de setembro de 2021 14:00
  • Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:

    with CTE_Budgetds as
    (
        select 
            CodCliente,
            Ano,
            Mes,
            CodItem,
            SUM(b.valorprev) as budget,
            SUM(b.meta) as budgetkg 
        from budgetds b 
        WHERE 
            Ano = '2021' and
            Mes = '9' and
            CodItem = '7047'
        group by 
            CodCliente, 
            Ano, 
            Mes, 
            CodItem
    )
    
    SELECT 
        s.AnoFrances, 
        b.ano,
        s.TrimFrances, 
        b.mes, 
        s.Supervisor, 
        b.CodCliente, 
        s.NomeCliente, 
        s.Estado, 
        s.CategProd, 
        s.GrupoProd, 
        s.LinhaProd, 
        s.NomePadrao, 
        b.CodItem, 
        s.Item, 
        s.Composicao, 
        s.DocEntry, 
        s.NF, 
        s.Utilizacao, 
        s.CFOP, 
        s.IPI, 
        s.TotalImpostos, 
        s.CustoProd, 
        s.CustoUnit, 
        s.Qtde, 
        s.Preço, 
        s.VlrTotal,
        s.VlReal, 
        s.CustoTotal, 
        b.budget, 
        b.budgetkg 
    FROM CTE_Budgetds as b
    LEFT JOIN SALESMAP as s 
        on 
            b.CodCLiente = s.CodCLiente and 
            b.ano = s.ano and 
            b.mes = s.mes and 
            b.CodItem = s.CodItem 
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 21 de setembro de 2021 17:30