none
Meses faltantes na tabela de clientes RRS feed

  • Pergunta

  • Bom dia pessoal,

    Tenho uma dúvida sobre meses faltantes dentro de uma tabela de clientes. O meu cenário consiste em clientes que aparecem na minha tabela mensalmente, porém alguns aparecem com gaps como o exemplo abaixo.

    customer months
    Cliente 1 01/06/2017
    Cliente 1 01/08/2017
    Cliente 1 01/09/2017
    Cliente 1 01/10/2017
    Cliente 1 01/11/2017

    Reparem que o cliente 1 aparece no mês 06 até o mês 11. Porém na base ele não aparece no mês 07.

    Eu precisaria inserir uma linha para o cliente 1 com a data 01/07/2017 mas sem utilizar CTEs.

    Obrigado desde já! Abs

    quinta-feira, 15 de fevereiro de 2018 12:58

Respostas

Todas as Respostas

  • Qual é a sua duvida: Como inserir uma linha ou como detectar gaps?

    Att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 15 de fevereiro de 2018 16:00
  • Oi William , na verdade os dois. Eu preciso identificar os gaps e preencher com os meses, porém entre a data mínima e a máxima. 

    Obrigado pela atenção.

    Abs

    quinta-feira, 15 de fevereiro de 2018 18:59
  • E a data é sempre fixa? Digo, voce guarda somente o dia primeiro de cada mes?

    Att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    quinta-feira, 15 de fevereiro de 2018 19:26
  • Deleted
    quinta-feira, 15 de fevereiro de 2018 22:47
  • Sim , ela é apenas para ficar como date pois eu estava testando com algumas funções para data mas sem sucesso... Depois eu deixo YYYYMM na exibição.
    sexta-feira, 16 de fevereiro de 2018 10:41

  • Eu precisaria inserir uma linha para o cliente 1 com a data 01/07/2017 mas sem utilizar CTEs.

    Obrigado desde já! Abs

    Boa tarde , Isso seria facilmente resolvido usando CTEs recursivas,  ,fora essa solução eu só vejo  como saida 

    usar cursor , que vai te dar o mesmo resultado ,porem de forma mais lenta dependendo do tamanho da tabela ,

    por que a limitação de não usar CTEs ??

    Wesley Neves - Brasilia-DF     

    https://wesleyneves.wordpress.com/

    SELECT Tab.[that's me:]

    FROM

    (

        VALUES

            ('Wesley Neves'),

            ('Analista.NET'),

            ('Pós Graduando em Banco de Dados com ênfase em BI'),

            ('MTA -SQL Server'),

            ('MTA -Web Developed')

    ) AS Tab ("that's me:");


    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    sexta-feira, 16 de fevereiro de 2018 16:53
  • Cara, era BlZ?

    1 - Você precisa de uma tabela, com as datas possíveis, o ideal é você já ter uma tabela assim para trabalhar sempre que precisar de algo parecido, dá uma olhada na que eu trabalho:

    Com uma tabela assim, você da um distinct sempre que precisar.

    2 - Com uma tabela assim, você cria uma outra tabela com os todos os clientes / Meses distintos, algo como:

    select distinct a.customer, b. mes

    into #cliente_mes

    from    TABELA_CLIENTES a

    join     MESES_POSSIVEIS b

    on     A.MES = B.MES

    3 - A partir dessa tabela, você pode fazer a consulta:

    select   a.customer 

               ,a.mes

              ,qtde_vendas = isnull(b.qtde_vendas ,0) --- Exemplo

    from     #cliente_mes a

    left join      TABELA_CLIENTES  b

    on        a.customer = b.customer 

    and     a.mes = b.mes

    Sobre deixar AAAMM é simples:

    convert(varchar(6), min( getdate() ), 112 ) -- Substitui getdate() pelo campo de data da tabela

    sexta-feira, 16 de fevereiro de 2018 19:20
  • Deleted
    • Marcado como Resposta Junior Oslain segunda-feira, 19 de fevereiro de 2018 17:38
    sexta-feira, 16 de fevereiro de 2018 22:11
  • Oi Johnny , tudo bem e você?

    Primeiramente muito obrigado por dedicar parte do seu tempo na minha questão. Valeu mesmo!

    Eu uso muito este recurso que você explicou acima e funciona bem. Porém neste caso , eu não posso atribuir todas as possibilidades de meses para todos os clientes , pois eu estaria considerando que estes , estariam presentes em todos os períodos possíveis e não seria verdade. Baseado na data mínima e máxima , eu preciso preencher os gaps respeitando este intervalo e ai assim eu garantiria a presença dos clientes quando eles realmente apareceram...

    Muito obrigado!

    Abs

    segunda-feira, 19 de fevereiro de 2018 11:34
  • Olá Wesley , tudo bem?

    Como seria a lógica com a CTE? Como eu consigo identificar os gaps e com isso inserir os meses respeitando a data minima e máxima que os cliente apareceu na base?

    Obrigado

    segunda-feira, 19 de fevereiro de 2018 11:36
  • José, eu acabei conseguindo usar CTE(estava com problemas técnicos) e agora estou usando uma versão do SQL mais atualizada também. 

    A boa notícia é que funcionou! A sua lógica me atendeu e agora eu consigo preencher os gaps e seguir com o meu processo sem este problema.

    Muito obrigado pela a ajuda, tirou um grande obstáculo!

    Abs

    Junior

    segunda-feira, 19 de fevereiro de 2018 17:38
  • Deleted
    segunda-feira, 19 de fevereiro de 2018 18:56
  • Sim eu declarei por aqui. Mas fora isso não tive nenhum outro problema.

    Muda muito para a versão 2012? 

    Obrigado!

    Oslain Junior

    segunda-feira, 19 de fevereiro de 2018 19:12
  • Deleted
    segunda-feira, 19 de fevereiro de 2018 19:17
  • Boa dica, vou estudar o artigo para vermos como aplicar.

    Obrigado!

    Abs,

    Junior

    segunda-feira, 19 de fevereiro de 2018 20:03