Cookbook DAX — 10 Casos de Uso Reais
Cookbook DAX — 10 Casos de Uso Reais
Cada caso mostra o desafio de negócio, o prompt usado para gerar a fórmula com IA, o resultado em DAX e o impacto obtido. Todas as funções usadas (
CALCULATE,SAMEPERIODLASTYEAR,RANKX,DATESINPERIOD,ALLEXCEPTetc.) já estão documentadas na referência de funções da Biblioteca — use os casos abaixo como exemplo de aplicação, não como fonte de definição de função.
1. Dashboard de Vendas com Análise YoY
Setor: Varejo · Complexidade: Intermediária
Desafio: comparar a performance de vendas do ano atual com o mesmo período do ano anterior, com variação percentual e indicador de tendência (▲▼).
Prompt:
"Tenho uma tabela TabVendas com colunas Data (date), Produto (text), Valor (decimal) e uma tabela Calendario já relacionada. Crie 3 medidas DAX: (1) vendas do ano atual, (2) vendas do mesmo período do ano anterior e (3) variação percentual com símbolo de tendência. Use boas práticas com VAR e DIVIDE."
// Medida 1: Vendas Ano Atual
Vendas YTD = TOTALYTD(SUM(TabVendas[Valor]), Calendario[Data])
// Medida 2: Vendas Mesmo Período Ano Anterior
Vendas YTD LY =
CALCULATE(
[Vendas YTD],
SAMEPERIODLASTYEAR(Calendario[Data])
)
// Medida 3: Variação % com indicador visual
Variacao YoY =
VAR VAtual = [Vendas YTD]
VAR VAnterior = [Vendas YTD LY]
VAR Variacao = DIVIDE(VAtual - VAnterior, VAnterior, BLANK())
RETURN
IF(
ISBLANK(Variacao),
"N/D",
FORMAT(Variacao, "0.0%") & IF(Variacao >= 0, " ▲", " ▼")
)
Impacto relatado: redução de 3h/semana em análises manuais; identificação de queda de 12% nas vendas de março com ação corretiva em 48h; reuniões 40% mais rápidas com os indicadores visuais.
2. Análise RFM de Clientes
Setor: E-commerce · Complexidade: Avançada
Desafio: classificar clientes por Recência, Frequência e Monetário para segmentar campanhas de marketing.
Prompt:
"Tenho TabVendas (ClienteID, Data, Valor). Crie medidas DAX para uma análise RFM: (1) Recência em dias (hoje - última compra do cliente), (2) Frequência (número de compras), (3) Monetário (total gasto). Crie também uma coluna calculada que classifica cada cliente em: Campeão (R>=1, F>=3, M>=alto), Em Risco (R>=60 dias) ou Novo (F=1). Assuma que Alto Monetário = acima da mediana."
// Recência (dias desde última compra)
RFM_Recencia =
VAR UltimaCompra = CALCULATE(MAX(TabVendas[Data]), ALLEXCEPT(TabVendas, TabVendas[ClienteID]))
RETURN DATEDIFF(UltimaCompra, TODAY(), DAY)
// Frequência
RFM_Frequencia =
CALCULATE(DISTINCTCOUNT(TabVendas[PedidoID]), ALLEXCEPT(TabVendas, TabVendas[ClienteID]))
// Monetário
RFM_Monetario =
CALCULATE(SUM(TabVendas[Valor]), ALLEXCEPT(TabVendas, TabVendas[ClienteID]))
// Coluna Calculada: Segmento RFM
Segmento_RFM =
VAR Rec = DATEDIFF(MAX(TabVendas[Data]), TODAY(), DAY)
VAR Freq = CALCULATE(COUNTROWS(TabVendas), TabVendas[ClienteID] = EARLIER(TabVendas[ClienteID]))
VAR Mon = CALCULATE(SUM(TabVendas[Valor]), TabVendas[ClienteID] = EARLIER(TabVendas[ClienteID]))
VAR MedianaMonetario = MEDIAN(TabVendas[Valor])
RETURN
SWITCH(
TRUE(),
Rec <= 30 && Freq >= 3 && Mon >= MedianaMonetario, "Campeão",
Rec >= 60, "Em Risco",
Freq = 1, "Novo",
"Regular"
)
Impacto relatado: segmentação de 45.000 clientes automatizada (antes: 2 semanas no Excel); campanha para "Em Risco" recuperou R$ 280.000 em 30 dias; recompra dos "Campeões" subiu de 23% para 41%.
Nota técnica: Segmento_RFM usa EARLIER porque é uma coluna
calculada (contexto de linha) — RFM_Recencia/RFM_Frequencia/
RFM_Monetario são medidas e usam ALLEXCEPT porque operam em
contexto de filtro. Não confundir os dois padrões.
3. Meta vs. Realizado com Semáforo Visual
Setor: Saúde e Bem-Estar · Complexidade: Básica
Desafio: exibir o atingimento de meta em verde (≥90%), amarelo (75-89%) ou vermelho (<75%).
Prompt:
"Tenho TabVendas (Valor, Data) e TabMetas (Meta, Periodo). Crie uma medida que calcula o % de atingimento da meta e outra que retorna um emoji de semáforo (verde 🟢, amarelo 🟡, vermelho 🔴) baseado no atingimento."
// % de Atingimento
Pct Atingimento =
VAR VendasReais = SUM(TabVendas[Valor])
VAR MetaPeriodo = SUM(TabMetas[Meta])
RETURN DIVIDE(VendasReais, MetaPeriodo, 0)
// Semáforo Visual
Semaforo =
VAR Pct = [Pct Atingimento]
RETURN
SWITCH(
TRUE(),
Pct >= 0.90, "🟢 " & FORMAT(Pct, "0.0%"),
Pct >= 0.75, "🟡 " & FORMAT(Pct, "0.0%"),
"🔴 " & FORMAT(Pct, "0.0%")
)
Impacto relatado: reuniões de status caíram de 45min para 15min; visibilidade imediata acelerou a ação em regiões no vermelho.
4. Previsão de Estoque com DAX
Setor: Manufatura · Complexidade: Avançada
Desafio: identificar produtos com risco de ruptura nos próximos 30 dias, a partir do consumo médio dos últimos 3 meses.
Prompt:
"Tenho TabEstoque (ProdutoID, QtdAtual) e TabConsumo (ProdutoID, Data, QtdConsumida). Crie medidas para: (1) consumo médio diário dos últimos 90 dias, (2) dias de cobertura de estoque, (3) alerta de ruptura (TRUE se cobertura < 30 dias). Use DATESINPERIOD e AVERAGEX."
// Consumo Médio Diário (últimos 90 dias)
Consumo Medio Diario =
VAR Periodo90d = DATESINPERIOD(Calendario[Data], MAX(Calendario[Data]), -90, DAY)
VAR TotalConsumo = CALCULATE(SUM(TabConsumo[QtdConsumida]), Periodo90d)
RETURN DIVIDE(TotalConsumo, 90, 0)
// Dias de Cobertura
Dias Cobertura =
VAR EstoqueAtual = SUM(TabEstoque[QtdAtual])
VAR ConsumoDiario = [Consumo Medio Diario]
RETURN DIVIDE(EstoqueAtual, ConsumoDiario, 9999)
// Alerta de Ruptura
Alerta Ruptura =
IF([Dias Cobertura] < 30, "⚠️ RISCO DE RUPTURA", "✅ Estoque OK")
Impacto relatado: identificação proativa de 47 SKUs em risco; redução de 35% nas rupturas de estoque no trimestre seguinte.
5. Análise de Cohort de Retenção
Setor: SaaS / Assinaturas · Complexidade: Avançada
Desafio: medir a retenção de clientes por coorte de aquisição — quais grupos ficam mais tempo assinando.
Prompt:
"Tenho TabAssinaturas (ClienteID, DataInicio, DataFim). Crie uma análise de cohort: para cada mês de aquisição, calcule quantos clientes ainda estavam ativos nos meses 1, 2, 3, 6 e 12 após a aquisição. Use DATE, DATEDIFF e CALCULATE."
// Mês de Aquisição do Cliente
Mes Aquisicao = FORMAT(TabAssinaturas[DataInicio], "YYYY-MM")
// Taxa de Retenção em N meses
Retencao N Meses =
VAR N = SELECTEDVALUE(TabMeses[Meses], 1)
VAR CohortData = MIN(TabAssinaturas[DataInicio])
VAR DataAlvo = EDATE(CohortData, N)
VAR ClientesAtivos =
CALCULATE(
DISTINCTCOUNT(TabAssinaturas[ClienteID]),
TabAssinaturas[DataInicio] <= DataAlvo,
TabAssinaturas[DataFim] >= DataAlvo
)
VAR ClientesOriginais =
CALCULATE(
DISTINCTCOUNT(TabAssinaturas[ClienteID]),
ALLEXCEPT(TabAssinaturas, TabAssinaturas[Mes Aquisicao])
)
RETURN DIVIDE(ClientesAtivos, ClientesOriginais, 0)
Impacto relatado: clientes vindos de indicação retêm 2,3× mais; realocação de orçamento de marketing elevou o ROI em 180%.
6. Análise de Pareto (80/20) Dinâmica
Setor: Universal · Complexidade: Intermediária
Desafio: identificar quais produtos respondem por 80% das vendas, de forma dinâmica conforme filtros de período/região.
Prompt:
"Tenho TabVendas (Produto, Valor). Crie uma medida DAX que identifica se o produto atual é responsável por 80% acumulado das vendas (Pareto 80/20). Use RANKX para ordenar e TOPN para calcular o acumulado."
// Ranking de vendas por produto
Rank Vendas Produto =
RANKX(ALL(TabVendas[Produto]), SUM(TabVendas[Valor]), , DESC, Dense)
// Vendas acumuladas até este produto (% do total)
Pct Acumulado =
VAR RankAtual = [Rank Vendas Produto]
VAR TotalGeral = CALCULATE(SUM(TabVendas[Valor]), ALL(TabVendas[Produto]))
VAR VendasAcumuladas =
CALCULATE(
SUM(TabVendas[Valor]),
FILTER(ALL(TabVendas[Produto]), [Rank Vendas Produto] <= RankAtual)
)
RETURN DIVIDE(VendasAcumuladas, TotalGeral, 0)
// Classificação Pareto
Pareto Class =
SWITCH(
TRUE(),
[Pct Acumulado] <= 0.80, "🔴 Top 80%",
[Pct Acumulado] <= 0.95, "🟡 Próximos 15%",
"⚪ Cauda (5%)"
)
Impacto relatado: 23 de 847 SKUs respondem por 80% do faturamento; foco de promoções nesses 23 gerou +15% de margem.
7. Ticket Médio com Benchmark
Setor: Restaurante / Food Service · Complexidade: Básica
Desafio: comparar o ticket médio de cada unidade com a média da rede, destacando unidades acima/abaixo.
// Ticket Médio da Unidade
Ticket Medio Unidade = DIVIDE(SUM(Pedidos[Valor]), COUNTROWS(Pedidos), 0)
// Ticket Médio da Rede (ignora filtro de unidade)
Ticket Medio Rede =
CALCULATE(
DIVIDE(SUM(Pedidos[Valor]), COUNTROWS(Pedidos), 0),
ALL(Lojas[Unidade])
)
// Classificação vs. Rede
Status vs Rede =
VAR DifPct = DIVIDE([Ticket Medio Unidade] - [Ticket Medio Rede], [Ticket Medio Rede], 0)
RETURN
SWITCH(
TRUE(),
DifPct >= 0.10, "🌟 Acima da Rede +" & FORMAT(DifPct, "0.0%"),
DifPct >= -0.10, "📊 Na Média " & FORMAT(DifPct, "0.0%"),
"⚠️ Abaixo da Rede " & FORMAT(DifPct, "0.0%")
)
8. Taxa de Conversão de Funil de Vendas
Setor: Vendas B2B / CRM · Complexidade: Intermediária
Desafio: calcular a conversão entre etapas do funil e identificar o gargalo.
// Total por Etapa
Total Etapa =
CALCULATE(
DISTINCTCOUNT(Funil[OportunidadeID]),
Funil[Etapa] = SELECTEDVALUE(Etapas[Nome])
)
// Taxa de Conversão Etapa N -> Etapa N+1
Taxa Conversao =
VAR EtapaAtual = SELECTEDVALUE(Etapas[Ordem])
VAR QtdAtual = [Total Etapa]
VAR EtapaAnterior = EtapaAtual - 1
VAR QtdAnterior =
CALCULATE([Total Etapa], FILTER(Etapas, Etapas[Ordem] = EtapaAnterior))
RETURN DIVIDE(QtdAtual, QtdAnterior, 0)
// Etapa com maior taxa de abandono
Etapa Gargalo =
FIRSTNONBLANK(TOPN(1, Etapas, [Taxa Conversao], ASC), 1)
9. Churn Rate Mensal
Setor: Telecom / SaaS · Complexidade: Avançada
Desafio: calcular o churn mensal e projetar o churn anualizado.
// Clientes Ativos no Início do Período
Clientes Inicio Mes =
CALCULATE(
DISTINCTCOUNT(TabAssinaturas[ClienteID]),
DATESBETWEEN(
Calendario[Data],
STARTOFMONTH(PREVIOUSMONTH(MAX(Calendario[Data]))),
ENDOFMONTH(PREVIOUSMONTH(MAX(Calendario[Data])))
)
)
// Cancelamentos no Mês
Cancelamentos Mes =
CALCULATE(
DISTINCTCOUNT(TabAssinaturas[ClienteID]),
DATESMTD(TabAssinaturas[DataCancelamento])
)
// Churn Rate Mensal
Churn Rate Mensal = DIVIDE([Cancelamentos Mes], [Clientes Inicio Mes], 0)
// Churn Anualizado (projeção)
Churn Anualizado = 1 - POWER(1 - [Churn Rate Mensal], 12)
10. Dashboard Executivo em 10 Medidas
Setor: Universal · Complexidade: Todas
Desafio: montar um conjunto completo de KPIs executivos para acompanhamento diário.
Prompt:
"Tenho TabVendas (Data, ClienteID, ProdutoID, Valor, Custo), Calendario e TabMetas (Meta, Mes). Crie as 10 medidas essenciais para um dashboard executivo: faturamento, margem, ticket médio, meta, variação MoM, variação YoY, novos clientes, top produto, dias sem venda e forecast. Use as melhores práticas DAX."
// 1. Faturamento Período
Faturamento = SUM(TabVendas[Valor])
// 2. Margem Bruta %
Margem Bruta % =
VAR Receita = SUM(TabVendas[Valor])
VAR Custo = SUM(TabVendas[Custo])
RETURN DIVIDE(Receita - Custo, Receita, 0)
// 3. Ticket Médio
Ticket Medio = DIVIDE([Faturamento], DISTINCTCOUNT(TabVendas[PedidoID]), 0)
// 4. Atingimento de Meta
Atingimento Meta % = DIVIDE([Faturamento], SUM(TabMetas[Meta]), 0)
// 5. Crescimento MoM
Crescimento MoM =
DIVIDE(
[Faturamento] - CALCULATE([Faturamento], PREVIOUSMONTH(Calendario[Data])),
CALCULATE([Faturamento], PREVIOUSMONTH(Calendario[Data])),
BLANK()
)
// 6. Crescimento YoY
Crescimento YoY =
DIVIDE(
[Faturamento] - CALCULATE([Faturamento], SAMEPERIODLASTYEAR(Calendario[Data])),
CALCULATE([Faturamento], SAMEPERIODLASTYEAR(Calendario[Data])),
BLANK()
)
// 7. Novos Clientes (1ª compra no período)
Novos Clientes =
CALCULATE(
DISTINCTCOUNT(TabVendas[ClienteID]),
FILTER(
VALUES(TabVendas[ClienteID]),
CALCULATE(MIN(TabVendas[Data])) >= MIN(Calendario[Data])
)
)
// 8. Produto Top (maior faturamento)
Top Produto =
CALCULATE(
MAX(TabVendas[ProdutoNome]),
TOPN(1, VALUES(TabVendas[ProdutoNome]), [Faturamento], DESC)
)
// 9. Dias desde última venda
Dias Sem Venda = DATEDIFF(MAX(TabVendas[Data]), TODAY(), DAY)
// 10. Forecast Linear (projeção do mês com base nos dias passados)
Forecast Mes =
VAR DiaAtual = DAY(TODAY())
VAR DiasNoMes = DAY(EOMONTH(TODAY(), 0))
VAR FaturamentoMTD = TOTALMTD([Faturamento], Calendario[Data])
RETURN DIVIDE(FaturamentoMTD, DiaAtual, 0) * DiasNoMes
Impacto relatado: dashboard montado em 2h (vs. 2 dias no método tradicional); 10 KPIs cobrindo 90% das perguntas da diretoria.
Nota de curadoria
Conteúdo autoral do livro-fonte (prompts e fórmulas escritos pelo autor) — sem risco de direitos autorais e sem necessidade de validação contra Microsoft Learn, já que não faz nenhuma afirmação sobre a linguagem em si. As funções DAX usadas nos 10 casos já passaram pela auditoria função-a-função dos lotes 1-15. Removida a moldura de "Dica Pro"/tom de tutorial do livro-fonte; mantidas as fórmulas DAX e os números de impacto exatamente como no original.