30 Replies Latest reply: Oct 10, 2014 9:59 AM by Cleber Nogueira RSS

    Comparação Períodos Atual e Anterior

      Boa tarde;

       

      Estou iniciando a construção de um Dashboard, e nessa não terei seleção alguma, todos os filtros deverão ser feito via setanalysis.

       

      Tenho um determinado gráfico, que ira comparar as vendas do mês atual com o mês anterior.

       

      Suponhamos que hoje é dia 10/08/2014.

       

      Vendas Mes_Atual - com a expressão ele ira somar de 01/08/2014 a 10/08/2014:

      SUM( {<ANO=Year(Today()), MES=Month(Today())>}   VENDA_LIQUIDA)

       

      Vendas Mes_Anterior - com a expressão ele ira somar de 01/07/2014 a 31/07/2014:

      SUM( {<ANO=Year(Today())-1, MES=Month(Today())-1>}   VENDA_LIQUIDA)

       

      Como o Mes_Atual nunca estará "completo", preciso corrigir a expressão Mes_Anterior, para que some apenas o período correspondente, assim terei a comparação correta.

       

      Qual seria a maneira mais simples de fazer isso ?

        • Re: Comparação Períodos Atual e Anterior

          Cléber,

           

          Você pode criar uma variável apontando para o seu mês anterior e utiliza-la ex:

           

          SUM({$< Mes={$(vMesAnt)},Ano={$(vAnoAtual)}>} VENDA_LIQUIDA)

           

          Você pode adicionar o seguinte comando na variável

          Mês anterior: =Num(Month(Today(0)))-1

          Ano Atual: =Year(Today(0))

            • Re: Comparação Períodos Atual e Anterior

              Acho que estou me enrolando com a sintaxe do setanalysis quando necessita usar "menor igual".

              A variavel vMesAtual = 'Agosto', ou seja...o mes corrente.

               

              Preciso que some de janeiro a agosto do ano anterior, entao fiz assim:

               

              =sum({<ANO= {$(#vAnoAnterior)},MES= {'<=$(#vMesAtual)'} >} VENDA_LIQUIDA)

               

              ...mas o resultado esta dando zero...

               

              ele nao deveria somar janeiro a agosto de 2013 ??

            • Re: Comparação Períodos Atual e Anterior
              Fernando Tonial

              Olá, veja esse post.

               

              Soma YTD

               

              Basta alterar o seu inicio do período, nesse caso para o início do Mês.

               

              Qlikfique-se.

              Tonial.

                • Re: Comparação Períodos Atual e Anterior

                  Ja tinha lido outro post seu que sugere a criação do flag e daquelas variáveis, mas achei muito elaborado pro que eu preciso, daria pra fazer algo mais simples.

                   

                  Acho que estou me enrolando com a sintaxe do setanalysis quando necessita usar "menor igual".

                  A variavel vMesAtual = 'Agosto', ou seja...o mês corrente.

                   

                  Preciso que some de janeiro a agosto do ano anterior, entao fiz assim:

                   

                  =sum({<ANO= {$(#vAnoAnterior)},MES= {'<=$(#vMesAtual)'} >} VENDA_LIQUIDA)

                   

                  ...mas o resultado esta dando zero...

                   

                  ele não deveria somar janeiro a agosto de 2013 ??

                • Re: Comparação Períodos Atual e Anterior
                  Normélio Junior

                  Amigo, boa tarde!

                   

                  Percebi que você deve ter um calendário carregado, pois tem campos de MES e ANO, então provavelmente vc tem um campo com a data completa também. Use esse campo com a data completa no lugar de "SUA_DATA" em minha expressão.

                   

                  'Venda Mês Corrente: '&

                  Sum({1<SUA_DATA= {"<=$(=Max(SUA_DATA))>=$(=MonthStart(Max(SUA_DATA)))"}

                      >} VENDA_LIQUIDA)

                   

                  'Venda Mês Anterior até o dia atual: '&

                  Sum({1<SUA_DATA= {"<=$(=AddMonths(Max(SUA_DATA),-1))>=$(=MonthStart(AddMonths(Max(SUA_DATA),-1)))"}

                      >} VENDA_LIQUIDA)

                   

                  Espero ter ajudado.

                    • Re: Comparação Períodos Atual e Anterior

                      ola Junior, bom dia !

                       

                      Tenho sim um calendário carregado, bem como o campo da data completa.

                       

                      Na verdade quero comparar o mês atual, com os dias ate a data presente, versus o mesmo mês do ANO anterior, no mesmo período de dias.

                        • Re: Comparação Períodos Atual e Anterior
                          Normélio Junior

                          Bom dia, tente fazer assim então!

                           

                          //VENDA LIQUIDA DO MÊS CORRENTE

                          Sum({1<SUA_DATA= {"<=$(=Max(SUA_DATA))>=$(=MonthStart(Max(SUA_DATA)))"}

                              >} VENDA_LIQUIDA)

                           

                          //VENDA LIQUIDA DO MÊS CORRENTE POREM ANO ANTERIOR

                          Sum({1<SUA_DATA= {"<=$(=AddYears(Max(SUA_DATA), -1))>=$(=MonthStart(AddYears(Max(SUA_DATA), -1)))"}

                              >} VENDA_LIQUIDA)

                           

                          Caso isso não lhe sirva, me envie somente o LOAD do seu calendário para eu enviar uma aplicação de exemplo pra você.

                           

                          Estou a disposição, abraço!

                            • Re: Comparação Períodos Atual e Anterior

                              Acho que estamos quase lá...acho que ainda não consegui passar o que estou precisando...vou tentar me expressar melhor:

                               

                              - preciso de 2 números, para posteriormente fazer um percentual dividindo um pelo outro

                              - venda total do ano atual (esse numero ja tenho com SUM( {<ANO=Year(Today()), MES=Month(Today())>} 

                              VENDA_LIQUIDA)

                              - venda total do ano anterior, do mesmo período da formula acima, ou seja, se hoje estamos no dia 01/09/2014, terei os números:

                              - $999999 - correspondente de 01/01/2014 a 01/09/2014

                              - $999999 - correspondente de 01/01/2013 a 01/09/2013.

                               

                              depois farei o mesmo com o mês atual vs mês anterior

                              - $999999 - correspondente de 01/09/2014 a 01/09/2014

                              - $999999 - correspondente de 01/09/2013 a 01/09/2013.

                               

                              Abaixo segue meu calendário, pra vc ter uma ideia. Muito obrigado pela atenção !

                               

                              LET vDateMin = Num(MakeDate(2011,01,1)); 

                              //LET vDateMax = Floor((Today()-1));

                              LET vDateMax = Floor((Today()+3)); 

                              LET vDateToday = Num(Today()); 

                               

                              TempCalendar: 

                              LOAD

                              $(vDateMin) + RowNo() - 1 AS DateNumber, 

                              Date($(vDateMin) + RowNo() - 1) AS TempDate 

                              AUTOGENERATE 1 

                              WHILE $(vDateMin)+IterNo()-1<= $(vDateMax); 

                               

                              Calendar: 

                              LOAD

                              date(Floor([TempDate]),'DD/MM/YYYY') as DATA,

                              week(Floor([TempDate])) as semanacalendario,

                                if(month(weekend([TempDate]))= month([TempDate]),div(day(WeekEnd([TempDate])),7),div(day(Weekend([TempDate],-1)),7)+1)+1 as NumeroSemanaMes, 

                               

                              // Standard Date Objects

                              Day(TempDate) AS DIA,

                              Num(Month(TempDate)) AS MêsNum,

                              WeekDay(TempDate) AS [Dia da Semana], 

                              Week(TempDate) AS [Semana], 

                              Month(TempDate) AS MES, 

                              //'Q' & Ceil(Month(TempDate)/3) AS CalendarQuarter, 

                              Year(TempDate) AS ANO,

                               

                              // Calendar Date Names 

                              WeekName(TempDate) as SemanaAno, 

                              monthname(TempDate) as  MESANO, 

                              QuarterName(TempDate) as Quarter

                               

                              RESIDENT TempCalendar ORDER BY TempDate ASC; 

                               

                              DROP TABLE TempCalendar; 

                               

                              LET vDateMin = Num(MakeDate(2000,1,1)); 

                              LET vDateMax = Floor(YearEnd(AddMonths(Today(), 12))); 

                              LET vDateToday = Num(Today());

                                • Re: Re: Comparação Períodos Atual e Anterior
                                  Normélio Junior

                                  Bom dia!

                                   

                                  Eu tentei exemplificar ao máximo como proceder para achar as datas máximas e mínimas de um período. Abra a aplicação, veja o objeto de texto, faça seleções e vá dando uma olhada para ver se é isso que você precisa. Depois é somente adaptar a sua necessidade real.

                                   

                                  Abraço!

                                  • Re: Re: Comparação Períodos Atual e Anterior
                                    Fernando Tonial

                                    Olá Cleber,

                                     

                                    Vamos tentar novamente.

                                    Primeiro Crie um campo Flag em seu calendário.

                                    Faça assim:


                                    If(DATA<='$(vHoje)',1,0) AS FlgRealizado

                                     

                                    E a variável vHoje é a data de referência

                                     

                                    SET vHoje = Today();

                                     

                                    Crie as seguintes variáveis através do Menu Configurações > Visão Geral das Variáveis:

                                     

                                    vInicioYTDAtual: =YearStart(Max({<FlgRealizado={1}>} DATA)) //Inicio do Maior Ano

                                    vFimYTDAtual: =Max({<FlgRealizado={1}>} DATA) //Hoje

                                    vInicioYTDAnterior: =YearStart(AddYears(Max({<FlgRealizado={1}>} DATA),-1))//Inicio do Ano Anterior

                                    vFimYTDAnterior: =AddYears(Max({<FlgRealizado={1}>} DATA),-1)//Mesma data de Hoje, mas no ano Anterior

                                     

                                    vInicioMTDAtual: =MonthStart(Max({<FlgRealizado={1}>} DATA)) //Inicio do Mês Atual

                                    vFimMTDAtual: =Max({<FlgRealizado={1}>} DATA) //Hoje

                                    vInicioMTDAnterior: =MonthStart(AddYears(Max({<FlgRealizado={1}>} DATA),-1))//Inicio do mesmo mês no ano Anterior

                                    vFimMTDAnterior: =AddYears(Max({<FlgRealizado={1}>} DATA),-1)//Mesma data de Hoje, mas no ano Anterior

                                     

                                    Você pode fazer assim:

                                    YTD Ano Atual - correspondente de 01/01/2014 a 01/09/2014

                                    Sum({<DATA={">=$(vInicioYTDAtual)<=$(vFimYTDAtual)"}, MES=, ANO=>} VENDA_LIQUIDA)

                                     

                                    YTD Ano Anteior - correspondente de 01/01/2013 a 01/09/2013

                                    Sum({<DATA={">=$(vInicioYTDAnterior)<=$(vFimYTDAnterior)"}, MES=, ANO=>} VENDA_LIQUIDA)

                                     

                                    MTD Ano Atual - correspondente de 01/09/2014 a 01/09/2014

                                    Sum({<DATA={">=$(vInicioMTDAtual)<=$(vFimMTDAtual)"}, MES=, ANO=>} VENDA_LIQUIDA)

                                     

                                    MTD Ano Anteior - correspondente de 01/09/2013 a 01/09/2013

                                    Sum({<DATA={">=$(vInicioMTDAnterior)<=$(vFimMTDAnterior)"}, MES=, ANO=>} VENDA_LIQUIDA)

                                     

                                    Qlikfique-se.

                                    Tonial.

                                    • Re: Re: Comparação Períodos Atual e Anterior
                                      Normélio Junior

                                      Boa tarde!

                                       

                                      E ai amigo, conseguiu resolver? Oque a comunidade te enviou ajudou?

                                       

                                      Abraço!

                                        • Re: Re: Comparação Períodos Atual e Anterior

                                          Bom dia Srs;

                                           

                                          Desculpa a falta de agilidade, infelizmente não trabalho somente com o Qlik, tenho toda a estrutura de TI pra cuidar.

                                           

                                          Bem, vamos lá...estou em dúvida em qual solução adotar, gostei desse exemplo de calendário que me passou, bem mais Clean do que o meu, que foi criado pela consultoria que desenvolveu a primeira aplicação aqui, tenho usado ele nas outras aplicações por estar na mesma nuvem de dados.

                                           

                                          A solução do Tonial é bem legal também, será que o mais correto seria tentar substituir o meu calendário ajustando o nome dos campos com o que já tenho hoje para não perder as referências, ou aplicar a solução das variáveis, pro meu caso que não tenho muita experiência ?

                                           

                                          obrigado pela ajuda

                                            • Re: Comparação Períodos Atual e Anterior
                                              Normélio Junior

                                              Bom dia!

                                               

                                              Bom, se você conseguiu o resultado esperado com os dois modelos que lhe foi passado, acho que vale mais aquele que lhe de menos trabalho, mas claro, também pensando a médio e longo prazo, vale analisar um possível retrabalho caso a escolha não tenha sido a correta. No meu caso, eu sempre opto por aquilo que não me dará retrabalho ou que eu não precise ficar escrevendo tudo sempre de novo, também prefiro a ideia de um script mais "complexo" talvez, para que me atenda o mais próximo possível sem precisar de muitos set analysis e muitas variáveis no layout.

                                               

                                              Porem eu não tenho o seu cenário como um todo, talvez valha a pena pedir a opinião do Fernando Tonial, ele tem uma grande experiência.

                                               

                                              Em fim que bom que pudemos ajudar você. Qualquer que seja a sua alternativa adotada, não deixe de marcar a resposta correta para que outros que passem pelo mesmo problema, possam utilizar-se da mesma solução.

                                               

                                              Estou a disposição, abraço!

                                                • Re: Re: Comparação Períodos Atual e Anterior

                                                  Junior;

                                                   

                                                  Meu calendário está lá no começo dos posts, você tinha pedido anteriormente. Como te falei, ele é bem mais longo que o seu, usa variáveis, fica mais confuso, o seu esta bem clean e gostaria de utiliza-lo.

                                                   

                                                  Comentei o meu Calendario todo na minha aplicação e estou tentando ajustar o seu calendário com os meus nomes de campos utilizados na aplicação. Só não estou entendendo algumas coisas, tipo....o campo DATA.

                                                  Você usa ele logo no início em:

                                                  LOAD Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as CAL_DATA,

                                                  porém ele só é criado no LOAD que esta lá embaixo:

                                                  LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA

                                                    • Re: Re: Re: Comparação Períodos Atual e Anterior
                                                      Normélio Junior

                                                      Então, vamos lá!

                                                       

                                                      Esse meu calendário é gerado sempre do primeiro dia do ano de 3 anos atrás até o ultimo dia do ano atual.

                                                      Ele não é gerado a partir de uma data de alguma carga sua, como por exemplo carga de Faturamento, que poderia-se usar a data da Nota Fiscal como base para a geração desse calendário.

                                                       

                                                      Para vincular o calendário a sua data, basta fazer o seguinte:


                                                      CAL_CALENDARIO:

                                                      LOAD *

                                                      WHERE CAL_DATA <= TODAY();

                                                      LOAD Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as CAL_DATA,

                                                          Day(DATA)                                  as CAL_DIA,

                                                          Month(DATA)                                as CAL_MÊS,

                                                          Year(DATA)                                  as CAL_ANO,

                                                          DayNumberOfQuarter(DATA)                  as CAL_DIA_TRIMESTRE,

                                                          DayNumberOfYear(DATA)                      as CAL_DIA_ANO,

                                                          MonthName(DATA)                            as CAL_MÊS_ANO,

                                                          QuarterName(DATA)                          as CAL_QUARTER,

                                                          Week(DATA)                                as CAL_SEMANA,

                                                          ceil(Month(DATA)/3)&'º Trim'              as CAL_TRIMESTRE,

                                                          WeekDay(DATA)                              as CAL_DIA_SEMANA;

                                                        

                                                      LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA

                                                      AUTOGENERATE Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - Date(Date#('01/01/' & Text(Year(Today())-3), 'DD/MM/YYYY'));



                                                      Crie um novo campo data com o nome referente a qual campo você quer ligar, exemplo se você tiver uma tabela "Nota_Fiscal" com o campo "NF_DAT_EMISSÃO" então o calendário ficaria assim:


                                                      CAL_CALENDARIO:

                                                      LOAD *

                                                      WHERE CAL_DATA <= TODAY();

                                                      LOAD Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as NF_DAT_EMISSÃO, //chave de ligação com o campo data de emissão de nota

                                                          Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as CAL_DATA,

                                                          Day(DATA)                                  as CAL_DIA,

                                                          Month(DATA)                                as CAL_MÊS,

                                                          Year(DATA)                                  as CAL_ANO,

                                                          DayNumberOfQuarter(DATA)                  as CAL_DIA_TRIMESTRE,

                                                          DayNumberOfYear(DATA)                      as CAL_DIA_ANO,

                                                          MonthName(DATA)                            as CAL_MÊS_ANO,

                                                          QuarterName(DATA)                          as CAL_QUARTER,

                                                          Week(DATA)                                as CAL_SEMANA,

                                                          ceil(Month(DATA)/3)&'º Trim'              as CAL_TRIMESTRE,

                                                          WeekDay(DATA)                              as CAL_DIA_SEMANA;

                                                        

                                                      LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA

                                                      AUTOGENERATE Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - Date(Date#('01/01/' & Text(Year(Today())-3), 'DD/MM/YYYY'));


                                                      Caso eu não tenha conseguido ser claro, podes me enviar eu calendário com o nome dos campos que devem ser ligados que eu faço um exemplo pra você.


                                                      Abraço!

                                                        • Re: Re: Comparação Períodos Atual e Anterior

                                                          Consegui aqui, ficou assim:

                                                           

                                                          CALENDARIO:

                                                          LOAD *

                                                          WHERE DATA <= TODAY();

                                                          LOAD Date(num(trim(DATE#(DATA_TEMP, 'DD/MM/YYYY')))) as DATA,

                                                               Day(DATA_TEMP)                             as DIA,

                                                               Month(DATA_TEMP)                           as MES,

                                                               Year(DATA_TEMP)                            as ANO,

                                                               DayNumberOfQuarter(DATA_TEMP)              as DIA_TRIMESTRE,

                                                               DayNumberOfYear(DATA_TEMP)                 as DIA_ANO,

                                                               MonthName(DATA_TEMP)                       as MESANO,

                                                               QuarterName(DATA_TEMP)                     as QUARTER,

                                                               Week(DATA_TEMP)                            as SEMANA,

                                                               ceil(Month(DATA_TEMP)/3)&'º Trim'          as TRIMESTRE,

                                                               WeekDay(DATA_TEMP)                         as DIA_SEMANA,

                                                               WeekName(DATA_TEMP)                        as SEMANA_ANO;

                                                              

                                                          LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA_TEMP

                                                          AUTOGENERATE Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - Date(Date#('01/01/' & Text(Year(Today())-3), 'DD/MM/YYYY'));

                                                           

                                                          Conferi aba a aba, planilha a planilha com a anterior, fiz alguns ajustes e esta ok !

                                                           

                                                          Agora vou partir pros finalmente, o problema original do post...ja te falo.

                                                           

                                                          vlw !