BI, Power BI e Visualização

P2 · 10 questões × peso 3 = 30 pontos · prioridade: máxima
Visão do professorAprenda modelo, contexto e cálculo nessa ordem. Um relacionamento incorreto não costuma ser resolvido decorando mais funções DAX. Recomendo priorizar modelagem estrela, contexto de linha/filtro e CALCULATE, com pequenos exemplos calculados à mão. Depois conecte preparação em Power Query/M, modos de armazenamento, segurança e visualização. Conceitos de produto evoluem: confira a documentação e a versão abrangida pelo edital antes de tratar uma limitação antiga como regra atual.

Entenda do zero · BI e Power BI

BI não começa no gráfico. Começa na pergunta que alguém precisa responder para tomar uma decisão.

1. Para que serve BI?

Business Intelligence reúne processos e ferramentas para transformar dados em informação útil à gestão. Saber que houve R$ 8 milhões de arrecadação é um começo. Comparar esse valor com a meta, o período anterior e cada região ajuda a interpretar a situação. Um indicador dá contexto à medida; um KPI acompanha um objetivo considerado essencial.

2. O caminho básico dentro do Power BI

Você conecta as fontes, prepara os dados no Power Query, cria relacionamentos no modelo e monta cálculos e visuais. O Power Query usa a linguagem M para transformações, como corrigir tipos e remover duplicidades. DAX é a linguagem usada em medidas e outros cálculos do modelo. São ferramentas com funções diferentes.

3. Fatos e dimensões: números e contexto

Uma tabela fato pode registrar cada pagamento com data, contribuinte e valor. As dimensões descrevem entidades como calendário e município. No modelo estrela, dimensões se relacionam com a fato. Antes de somar, defina o grão: o que cada linha representa? Misturar totais mensais com pagamentos individuais pode duplicar resultados.

Na prática · uma medida que acompanha o filtro
Total arrecadado = SUM(Arrecadacao[Valor])

Sem restrições, a medida soma os valores visíveis no contexto atual. Ao selecionar um município no relatório, o filtro chega à fato por um relacionamento adequado, e a mesma medida passa a somar só esse município. Essa seleção compõe o contexto de filtro.

4. Coluna calculada e medida não são a mesma coisa

Em um modelo Import, uma coluna calculada normalmente é calculada por linha na atualização e armazenada. Uma medida é avaliada conforme o contexto da consulta. Para comparar evolução no tempo, uma linha costuma ajudar; para comparar categorias, barras costumam ser mais claras. O visual precisa responder à pergunta, não apenas decorar o painel.

Confira se entendeu: mudar um filtro exige escrever outra medida de total?

Em geral, não. A medida é reavaliada no novo contexto. Relacionamentos e expressões DAX que alteram filtros podem modificar esse comportamento.

A seguir, aprofunde modelagem, contextos DAX e visualização.

Arquitetura de BI, indicadores e métricas

TermoO que éExemplo SEFAZ
DadoFato brutoValor de uma NF-e
MétricaMedida quantitativa qualquerTotal arrecadado no mês
IndicadorMétrica contextualizada (razão, taxa, comparação)Arrecadação / PIB estadual
KPIIndicador-chave ligado a objetivo estratégico, com metaÍndice de recuperação da dívida ativa vs meta anual
MnemônicoBom indicador é SMART: eSpecífico, Mensurável, Atingível, Relevante, Temporal (prazo definido).
Pegadinha FCC"Toda métrica é um KPI" — errado. KPI é a métrica crítica, alinhada à estratégia e com meta. Também: indicador de resultado (lagging, mede o que já ocorreu) x indicador de tendência/desempenho (leading, antecipa o resultado).

Relatório x dashboard (conceito geral)

RelatórioDashboard (painel)
FocoDetalhe, exploração, várias páginasVisão consolidada de KPIs "num relance"
PúblicoAnalistasGestores, monitoramento

Tipos de análise e Self-service BI

AnálisePerguntaTécnicasValor/complexidade
DescritivaO que aconteceu?Relatórios, agregações, dashboardsMenor
DiagnósticaPor que aconteceu?Drill-down, correlação, análise de causa↑
PreditivaO que vai acontecer?Modelos estatísticos, ML, séries temporais↑↑
PrescritivaO que devemos fazer?Otimização, simulação, recomendaçãoMaior
Mnemônico"De Dia Prevejo e Prescrevo": Descritiva → Diagnóstica → Preditiva → Prescritiva. Ordem crescente de valor e de dificuldade (escada de Gartner). Diagnóstica = "por quê"; prescritiva = "o que fazer".
Pegadinha FCCTrocar preditiva com prescritiva: "a análise preditiva recomenda a melhor ação a tomar" — errado, recomendar ação é prescritiva. A preditiva estima o que provavelmente ocorrerá.

Self-service BI

BizuSelf-service não significa ausência de governança. Questão que diga "dispensa governança" ou "elimina o papel da TI" está errada.

Ecossistema Power BI

ComponenteFunção
Power BI DesktopAplicativo Windows gratuito para conectar, transformar (Power Query), modelar (DAX) e criar relatórios (.pbix)
Serviço do Power BI (nuvem, SaaS)Publicar, compartilhar, workspaces, apps, dashboards, atualização agendada, alertas, assinaturas
Power BI MobileConsumo em celular/tablet
Gateway de dados localPonte segura entre o serviço na nuvem e fontes on-premises (refresh e DirectQuery)
Power BI Report ServerPublicação on-premises
Microsoft FabricPlataforma unificada de dados (OneLake, lakehouse, data factory) na qual o Power BI está integrado
Relatório (Power BI)Dashboard (Power BI)
PáginasUma ou váriasUma única tela (canvas)
Onde se criaDesktop e ServiçoSomente no Serviço
FonteUm modelo semânticoBlocos (tiles) fixados de vários relatórios/modelos
InteratividadeAlta: filtros, segmentações, drillLimitada: clicar no bloco leva ao relatório
Alertas de dadosNãoSim (em blocos de cartão, KPI e medidor)
Pegadinha FCC"O dashboard é criado no Power BI Desktop e pode ter várias páginas" — errado duas vezes: dashboard é recurso do Serviço e tem uma página. Relatório é que tem várias páginas.
BizuAtualização agendada no Serviço: até 8 por dia com licença Pro e até 48 por dia em capacidade Premium/Fabric. Fonte local (on-premises) exige gateway.

Modos de armazenamento e conexão

ModoOnde ficam os dadosVantagemLimitação
Import (importação)Copiados para o modelo em memória (motor VertiPaq, colunar e comprimido)Desempenho máximo, DAX e Power Query completosDado só tão atual quanto o último refresh; limite de tamanho do modelo
DirectQueryPermanecem na fonte; cada visual gera consultaDado quase em tempo real; volumes muito grandesMais lento, depende da fonte; algumas transformações/funções limitadas
Dual (duplo)Tabela pode agir como Import ou DirectQuery conforme a consultaÚtil para dimensões em modelos compostos—
Composto (composite)Mistura tabelas Import e DirectQuery no mesmo modeloEquilíbrio desempenho x atualidadeMais complexo
Conexão dinâmica (Live connection)Conecta a um modelo já publicado (Analysis Services / modelo semântico do Serviço)Reaproveita modelo certificadoNão edita o modelo de origem (sem Power Query)
Direct Lake (Fabric)Lê direto as tabelas Delta do OneLakeDesempenho próximo do Import sem cópia/refresh tradicionalExige Fabric/OneLake
MnemônicoImport = "foto" (rápida, mas envelhece até o próximo refresh). DirectQuery = "câmera ao vivo" (atual, mas depende do sinal da fonte). Composto = "foto + câmera".
Pegadinha FCC"No modo DirectQuery os dados são armazenados no arquivo .pbix" — errado: no DirectQuery só fica o metadado; os dados ficam na fonte. Quem armazena dados no modelo é o Import.

Power Query: transformações e tipos

TransformaçãoO que faz
Remover/escolher colunas e linhas, remover duplicatas, remover errosLimpeza
Usar primeira linha como cabeçalhoPromove cabeçalhos
Dividir coluna (por delimitador, nº de caracteres)Ex.: "SP-Capital" → "SP" | "Capital"
Substituir valores, Preencher (para baixo/cima)Corrige vazios em relatórios "mesclados"
Agrupar porAgrega (soma, contagem…) como GROUP BY
Coluna personalizada / condicional / a partir de exemplosCria colunas por fórmula M, regras se-então ou exemplos digitados
Transformar x Adicionar colunaTransformar altera a coluna existente; Adicionar coluna cria nova mantendo a original

Pivot x Unpivot

Dinamizar coluna (Pivot)Transformar colunas em linhas (Unpivot)
Valores de uma coluna viram novas colunas (longo → largo)Várias colunas viram pares Atributo/Valor em linhas (largo → longo)
Ex.: coluna Mês com jan, fev → colunas Jan, FevEx.: planilha com colunas Jan…Dez → colunas Mês e Valor
BizuPlanilha de orçamento com um mês por coluna? Unpivot é quase sempre a resposta — modelo estrela quer dado "longo" (uma coluna de data e uma de valor).
Pegadinha FCCReferência x Duplicar consulta: Referência cria nova consulta que parte do resultado da original (alterações na original se propagam); Duplicar copia todas as etapas, independente. E "Desabilitar carga" mantém a consulta como intermediária sem carregá-la no modelo.

Power Query: combinar consultas (Mesclar x Acrescentar)

Mesclar consultas (Merge)Acrescentar consultas (Append)
Equivale em SQL aJOINUNION ALL
EfeitoAcrescenta colunas (lado a lado) pela coluna-chaveAcrescenta linhas (empilha)
UsoTrazer a razão social do cadastro para a tabela de notasJuntar arquivos de jan, fev, mar com mesma estrutura
Função MTable.NestedJoin (+ expandir)Table.Combine
MnemônicoMesclar = Mais colunas (lado a lado). Acrescentar = Abaixo (empilha linhas). M de Merge/Mais colunas; A de Append/Abaixo.

Os 6 tipos de junção do Mesclar

TipoRetorna
Externa esquerda (Left Outer) — padrãoTodas da primeira + correspondentes da segunda
Externa direita (Right Outer)Todas da segunda + correspondentes da primeira
Externa completa (Full Outer)Todas de ambas
Interna (Inner)Só correspondentes
Anti esquerda (Left Anti)Só as da primeira sem correspondência
Anti direita (Right Anti)Só as da segunda sem correspondência
Bizu"Quais contribuintes do cadastro não emitiram nenhuma nota?" → Mesclar com Anti esquerda. Há ainda a opção de correspondência difusa (fuzzy matching) para chaves de texto parecidas. Para juntar todos os arquivos de uma pasta: conector Pasta + "Combinar arquivos".

Linguagem M

let
    Fonte        = Csv.Document(File.Contents("C:\dados\nfe.csv"), [Delimiter=";"]),
    Cabecalhos   = Table.PromoteHeaders(Fonte),
    Tipos        = Table.TransformColumnTypes(Cabecalhos,
                     {{"dt_emissao", type date}, {"valor", type number}}),
    #"Só SP"     = Table.SelectRows(Tipos, each [uf] = "SP"),
    ComFaixa     = Table.AddColumn(#"Só SP", "faixa",
                     each if [valor] >= 10000 then "Alta" else "Baixa", type text)
in
    ComFaixa
Pegadinha FCCConfundir M com DAX: M = Power Query, prepara/transforma dados antes do modelo, é case-sensitive. DAX = cálculos no modelo (medidas, colunas calculadas), não é case-sensitive nos nomes de funções. "DAX é usada para importar e limpar dados" — errado.

Modelagem de dados no Power BI

Relacionamentos: cardinalidade e direção

CardinalidadeQuandoObservação
Um para muitos (1:*) / muitos para umDimensão → fato (o padrão desejado)Lado "1" com valores únicos
Um para um (1:1)Duas tabelas com chave única dos dois ladosFiltro sempre nos dois sentidos; avalie unir as tabelas
Muitos para muitos (*:*)Nenhum lado tem valores únicosUse com cautela; alternativa é tabela-ponte
Direção do filtro cruzadoEfeito
Única (Single) — padrão em 1:*Filtro flui do lado "1" (dimensão) para o lado "muitos" (fato)
Ambas (Both / bidirecional)Filtro flui nos dois sentidos; pode gerar ambiguidade e lentidão; use pontualmente (ou via CROSSFILTER numa medida)
Valor por Pagamento =
CALCULATE ( [Total Arrecadado],
            USERELATIONSHIP ( fPagamentos[DataPagamento], dCalendario[Data] ) )
BizuTransforme o mais a montante possível: limpeza e colunas derivadas simples no Power Query (ou na fonte), não em colunas calculadas DAX. Modelo estrela + medidas explícitas + tabela de datas marcada = resposta "boa prática" em quase toda questão de modelagem.
Mnemônico"O filtro desce a ladeira do 1 para o muitos": dimensão (1) filtra fato (*). Para subir a ladeira (fato filtrar dimensão), precisa de bidirecional ou CROSSFILTER.
Pegadinha FCC"O Power BI permite vários relacionamentos ativos entre as mesmas duas tabelas" — errado: um ativo, demais inativos. E "filtro bidirecional é a configuração recomendada por padrão" — errado: a recomendação é direção única.

DAX: fundamentos e contextos

Coluna calculadaMedidaTabela calculada
Quando calculaNa atualização (refresh), linha a linhaNa consulta, em tempo de exibiçãoNa atualização
Armazena?Sim (ocupa memória)NãoSim
Contexto naturalContexto de linhaContexto de filtro—
Reage a filtros/segmentações?Não (valor fixo por linha)SimNão
Uso típicoAtributo para fatiar/filtrar (faixa, categoria)Agregações, KPIs, %Tabela de datas, tabelas auxiliares
BizuRegra de bolso: vai para eixo, legenda ou segmentação? Coluna calculada (ou melhor, coluna no Power Query). Vai para a área de valores e precisa responder a filtros? Medida.

Os dois contextos

-- Coluna calculada em dContribuinte:
Total SEM transicao = SUM ( fNFe[Valor] )                -- mesmo total geral em todas as linhas
Total COM transicao = CALCULATE ( SUM ( fNFe[Valor] ) )  -- total de cada contribuinte
Total via medida    = [Total NFe]                         -- idem: medida já embute CALCULATE
Mnemônico"Linha itera, Filtro filtra, CALCULATE transforma". Contexto de linha percorre; contexto de filtro restringe; CALCULATE faz a ponte (transição).

Agregadores x iteradores

SUMSUMX
Soma uma colunaPercorre uma tabela linha a linha avaliando uma expressão e soma os resultados
SUM ( fNFe[Valor] )SUMX ( fItens, fItens[Qtd] * fItens[PrecoUnit] )
Não aceita expressãoCria contexto de linha
RELATEDRELATEDTABLE
Do lado muitos busca um valor no lado um (como PROCV)Do lado um retorna a tabela de linhas relacionadas no lado muitos
Na fato: RELATED ( dProduto[Categoria] )Na dimensão: COUNTROWS ( RELATEDTABLE ( fNFe ) )
Pegadinha FCCRELATED exige contexto de linha e relacionamento existente; usado do lado "1" para o lado "muitos" não funciona — aí é RELATEDTABLE. Inverter os lados é a troca preferida da banca.

Funções de contagem e utilidades

CALCULATE e funções de filtro

FunçãoO que fazUso típico
FILTER(tabela, condição)Iterador que retorna tabela com as linhas que atendem à condiçãoCondições complexas, comparar com medida
ALL(tabela ou colunas)Ignora (remove) todos os filtros da tabela/colunas; também retorna tabelaDenominador do % do total geral
ALLEXCEPT(tabela, col1, ...)Remove filtros da tabela exceto das colunas indicadas% dentro da UF (mantém UF, remove o resto)
ALLSELECTEDRemove filtros internos do visual, mas respeita os externos (segmentações)% do total visível
REMOVEFILTERSIgual ao ALL como modificador do CALCULATE (nome mais claro); não retorna tabelaLimpar filtros
VALUES(col) / DISTINCT(col)Valores distintos visíveis no contexto (VALUES pode incluir a linha em branco de integridade)Iterar sobre itens visíveis
SELECTEDVALUE(col [, alt])Retorna o valor se houver exatamente um no contexto; senão, o alternativoTítulos dinâmicos
HASONEVALUE(col)TRUE se há um único valor filtradoTratar linha de total
Total Arrecadado = SUM ( fArrecadacao[Valor] )

% do Total Geral =
DIVIDE ( [Total Arrecadado],
         CALCULATE ( [Total Arrecadado], ALL ( dMunicipio ) ) )

% dentro da UF =
DIVIDE ( [Total Arrecadado],
         CALCULATE ( [Total Arrecadado], ALLEXCEPT ( dMunicipio, dMunicipio[UF] ) ) )

Grandes Contribuintes =
CALCULATE ( [Total Arrecadado],
            FILTER ( dContribuinte, [Total Arrecadado] > 1000000 ) )
Mnemônico"ALL apaga tudo, ALLEXCEPT apaga exceto, ALLSELECTED apaga só o de dentro". FILTER escolhe linhas; ALL tira filtros.
Pegadinha FCC"FILTER remove filtros do contexto" — errado; FILTER restringe uma tabela (iterando linha a linha). Quem remove é ALL/REMOVEFILTERS. E usar FILTER(fatoInteira, ...) quando basta filtro de coluna é má prática de desempenho.
BizuNa linha de Total de uma tabela/matriz, a medida é recalculada no contexto do total (não é a soma das linhas exibidas). Por isso medidas com razão/média podem "não bater" com a soma visual — e isso é correto.

DAX: inteligência de tempo

Pré-requisito: tabela de datas contínua, marcada como tabela de datas e relacionada à fato.

FunçãoRetorna / faz
TOTALYTD(expr, datas)Acumulado do ano até a data (YTD). Também TOTALQTD, TOTALMTD; aceita data de fim de exercício
DATESYTD(datas)Tabela de datas do início do ano até a data — usada dentro de CALCULATE
SAMEPERIODLASTYEAR(datas)Mesmo período do ano anterior
DATEADD(datas, n, intervalo)Desloca o período em n dias/meses/trimestres/anos
PARALLELPERIOD(datas, n, intervalo)Período completo deslocado (mês/trimestre/ano inteiro)
DATESINPERIOD(datas, início, n, intervalo)Janela móvel (ex.: últimos 12 meses)
DATESBETWEEN(datas, início, fim)Intervalo entre duas datas
PREVIOUSMONTH / NEXTMONTH / PREVIOUSYEARPeríodo anterior/seguinte inteiro
Arrecadacao YTD  = TOTALYTD ( [Total Arrecadado], dCalendario[Data] )
Arrecadacao AA   = CALCULATE ( [Total Arrecadado], SAMEPERIODLASTYEAR ( dCalendario[Data] ) )
Variacao % AA    = DIVIDE ( [Total Arrecadado] - [Arrecadacao AA], [Arrecadacao AA] )
Movel 12 meses   = CALCULATE ( [Total Arrecadado],
                     DATESINPERIOD ( dCalendario[Data], MAX ( dCalendario[Data] ), -12, MONTH ) )
MnemônicoYTD = "Year To Date" (acumulado no ano); QTD = trimestre; MTD = mês. SPLY = Same Period Last Year = DATEADD(datas, -1, YEAR).
Pegadinha FCCDATEADD x PARALLELPERIOD: num contexto de 1 a 15/mar, DATEADD(-1, MONTH) devolve 1 a 15/fev; PARALLELPERIOD(-1, MONTH) devolve fevereiro inteiro.

Filtros, interações e segurança (RLS)

RLS — Row-Level Security (segurança em nível de linha)

-- Função "Auditor regional" na tabela dDelegacia
dDelegacia[EmailAuditor] = USERPRINCIPALNAME ()
Pegadinha FCC"RLS oculta colunas sensíveis do modelo" — errado: RLS filtra linhas; ocultar colunas/tabelas é OLS. E ocultar coluna na exibição de relatório não é segurança.
BizuRLS é o mecanismo para atender LGPD/sigilo fiscal no Power BI: cada delegacia ou auditor vê só os contribuintes de sua jurisdição, com um único relatório para todos.

Visualização de dados: escolha do gráfico

ObjetivoGráfico indicadoEvite
Comparar categoriasBarras (horizontais para rótulos longos) / colunas3D, pizza com muitas fatias
Evolução no tempoLinha; colunas para poucos períodosPizza
Composição (parte-todo)Pizza/rosca com poucas fatias; barras empilhadas 100%; treemapPizza com 8+ categorias
Composição ao longo do tempoÁrea empilhada, colunas empilhadas—
DistribuiçãoHistograma, boxplotPizza
Relação entre 2 variáveisDispersão (scatter); bolhas para 3ª variávelLinha
Variação incremental (ponte)Cascata (waterfall): receita prevista → ajustes → realizada—
Etapas de processoFunil—
Valor único / metaCartão, KPI, medidor (gauge)—
GeografiaMapa coroplético (preenchido), mapa de bolhas—
Detalhe tabularTabela, matriz (com subtotais e drill)—
Fatores que explicamVisuais de IA: Principais influenciadores, Árvore de decomposição, Perguntas e Respostas (Q&A)—
Mnemônico"CETDR" — antes de escolher o gráfico, pergunte o objetivo: Comparação (barras), Evolução (linha), Todo-parte / composição (pizza com poucas fatias, empilhada), Distribuição (histograma/boxplot), Relação (dispersão). "Cada Escolha Tem Dados e Razão".
Pegadinha FCCGráfico de barras com eixo Y que não começa no zero distorce a comparação (exagera diferenças). Em gráfico de linha o eixo truncado é aceitável. Duplo eixo Y também pode induzir correlação falsa.

Comunicação, storytelling e design de dashboards

Boas práticas de dashboard

Mnemônico"MENOS É MAIS" = Meta e contexto, Excesso fora (chartjunk), Números-chave no topo-esquerdo, Objetivo do público primeiro, Só um destaque de cor por visual.
BizuRecursos do Serviço muito cobrados: alertas (em blocos de cartão/KPI/medidor do dashboard), assinaturas por e-mail, Q&A (perguntas em linguagem natural), apps para distribuir conteúdo de um workspace, publicar na Web (público e sem autenticação — inadequado para dado sigiloso).
Pegadinha FCC"Publicar na Web" é forma segura de compartilhar relatório com dados de contribuintes — errado: o link é público, qualquer pessoa acessa. Para público interno use compartilhamento, apps ou incorporação segura.

Teste rápido

1. Medidas DAX são calculadas durante a atualização do modelo e armazenadas em memória, como as colunas calculadas.

Errado. Medidas são calculadas no momento da consulta, respondendo ao contexto de filtro, e não são armazenadas. Coluna calculada é que é computada no refresh e ocupa memória.

2. A função CALCULATE, quando executada em contexto de linha, realiza a transição de contexto, convertendo a linha atual em filtros equivalentes.

Certo. É a definição de transição de contexto; também ocorre ao referenciar uma medida dentro de contexto de linha.

3. Para empilhar as tabelas de arrecadação de janeiro, fevereiro e março, de mesma estrutura, deve-se usar Mesclar consultas.

Errado. Empilhar linhas é Acrescentar (Append, como UNION). Mesclar é junção (JOIN), acrescenta colunas.

4. Em um relacionamento um-para-muitos com direção de filtro única, a tabela do lado "um" filtra a tabela do lado "muitos".

Certo. O filtro flui da dimensão (1) para a fato (*).

5. A expressão CALCULATE([Total], ALL(dMunicipio)) retorna o total respeitando o filtro de município aplicado na segmentação.

Errado. ALL remove os filtros da tabela dMunicipio, retornando o total geral (base do "% do total").

6. No modo DirectQuery, os dados são importados para o motor VertiPaq, garantindo o melhor desempenho de consulta.

Errado. Isso descreve Import. No DirectQuery os dados ficam na fonte e cada visual dispara consulta.

7. A linguagem M do Power Query é sensível a maiúsculas e minúsculas, e uma consulta é estruturada pela expressão let ... in.

Certo. M é case-sensitive; o let define as etapas e o in indica o resultado.

8. Para transformar uma planilha com colunas Jan a Dez em duas colunas (Mês e Valor), usa-se a operação de:

Transformar colunas em linhas (Unpivot). Pivot faz o caminho inverso (valores de linhas viram colunas).

9. Dashboards do Power BI podem ter várias páginas e são criados no Power BI Desktop.

Errado. Dashboard tem uma única página e é criado no Serviço, fixando blocos de relatórios.

10. A análise que responde "o que devemos fazer para reduzir a inadimplência?" recomendando ações é a análise preditiva.

Errado. Recomendar ações é prescritiva. A preditiva estimaria quem provavelmente ficará inadimplente.

11. Entre duas tabelas pode haver mais de um relacionamento, mas apenas um ativo; os inativos podem ser usados em medidas com USERELATIONSHIP.

Certo. Caso típico: data de emissão (ativa) e data de pagamento (inativa) com a mesma tabela calendário.

12. SUMX(fItens, fItens[Qtd] * fItens[Preco]) e SUM(fItens[Qtd]) * SUM(fItens[Preco]) produzem sempre o mesmo resultado.

Errado. SUMX multiplica linha a linha e depois soma; o produto das somas é outra conta (e em geral dá valor diferente).