Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server e Azure SQL – Como criar uma tabela de calendário (dimensão de data) utilizando SQL (Incluindo feriados)

Visualizações: 1.109 views
Tempo de Leitura: 15 minutos

Fala pessoal!
Tudo bem com vocês?

Neste post eu gostaria de trazer a minha opinião sobre qual a melhor forma de se criar uma tabela de calendário. Essa tabela, muita usada para cenários de BI/Analytics, serve para agregar dados por diferentes dimensões de tempo/data e está presente em quase 100% dos relatórios e projetos de BI, sendo uma boa prática utilizá-la.

Vale lembrar que é uma péssima prática utilizar a hierarquia padrão de data do Power BI (Veja mais sobre isso clicando neste link aqui), e só deve ser utilizada em projetos muito pequenos, pontuais ou por usuários iniciantes.

Qualquer cenário diferente disso, deve exigir o uso de tabelas de Calendário ao invés de usar hierarquia padrão do Power BI, que cria uma tabela interna de calendário, bem básica, para cada coluna do tipo data que existe no modelo, prejudicando assim, a performance do modelo.

Muitos argumentam que é melhor criar utilizando SQL, outros em M, outros em DAX e a discussão vai se prologando mais do que deveria.

Qual a melhor forma criar uma tabela de calendário

Existem vários artigos muito interessantes sobre essa discussão e eu destacaria o artigo Power BI Date or Calendar Table Best Method: DAX or Power Query? como um dos melhores que já li sobre o assunto.

E vou dar a minha opinião sobre o isso:

DAXM / PowerQuerySQL
Eu posso criar uma tabela de calendárioSimSimSim
É fácil criar a tabela de calendárioSimSimSim
Minha tabela de calendário respeita o intervalo dos meus dadosSimSim, usando parâmetrosSim, filtrando na consulta
Posso calcular feriados nacionais, móveis e estaduaisNãoSim, mas dá muito trabalhoSim
Posso reaproveitar em outros relatórios (sem duplicar o código)NãoSim, mas apenas utilizando DataflowSim
Posso reaproveitar utilizando outras ferramentas de DatavizNãoNão (a não ser que use o PowerQuery online ou ADF/Synapse/Fabric)Sim

Agora que expressei a minha opinião, no qual acredito que a tabela calendário seria melhor aproveitada se criada numa base de DW utilizando SQL, para melhor reaproveitamento dos dados em qualquer cenário, projeto, relatório ou ferramenta, vou mostrar a vocês como criar a sua tabela de calendário utilizando SQL.

Como criar uma tabela de calendário utilizando SQL (Incluindo feriados)

Voltando no em 29 de julho 2015, apenas 5 dias após o lançamento oficial do Power BI (e que só seria disponibilizado no Brasil vários meses depois), eu já havia postado o artigo Como calcular dias úteis no SQL Server (Tabela dCalendario), onde mostro como criar uma tabela de calendário utilizando o SQL.

Nesse post eu gostaria de atualizar essa solução e apresentar a vocês alguns modelos de tabela de calendário, para que você utilize o modelo mais aderente à sua necessidade.

Modelo 1 – Tabela simplificada

Se você precisar de algo simples, rápido e objetivo, sem se preocupar com feriados e dias úteis, essa é uma boa opção para você.
Tabela de calendário simplificada, sem feriados e dias úteis

Resultado da tabela:

Modelo 2 – Tabela simplificada EM INGLÊS

Se você precisar de algo simples, rápido e objetivo, no idioma INGLÊS, sem se preocupar com feriados e dias úteis, essa é uma boa opção para você.
O último parâmetro da função é a quantidade de meses do FiscalYear, que adicionar N meses nas colunas fiscais.
Função table-valued que gera uma tabela de calendário simplificada EM INGLÊS, sem feriados e dias úteis

Resultado:

Modelo 3 – Tabela completa, com feriados e dias úteis

Se você precisa de uma tabela de calendário que lide com dias úteis e feriados, essa é a tabela para você, mesmo que ela demore 1 ou 2 minutos para gerar.

Tabela de calendário completa, sem feriados nacionais, estaduais e móveis

Resultado:

Para saber mais sobre a tabela de feriados, acesse o artigo Como criar uma tabela com os feriados (nacionais, estaduais e móveis) no SQL Server.

E é isso aí, pessoal!
E vocês? Como preferem criar sua tabela de calendário? Utilizando SQL, M ou DAX?

Espero que tenham gostado deste artigo e até a próxima 🙂