Cookbook: SQL → DAX Query View (12 padrões)

DAX

Quem vem do SQL reconhece SELECT, WHERE, GROUP BY e ORDER BY, mas a sintaxe da consulta DAX é outra. Os 12 padrões abaixo mostram a tradução lado a lado.

Duas camadas, dois nomes. O SQL consulta a camada física (TabFatVendaCamiseta, TabDimCalendario, colunas em PascalCase). O DAX consulta o modelo semântico, onde as mesmas tabelas aparecem com nome de negócio ('Vendas Camisetas', 'Calendário') — veja o Padrão de Nomenclatura.

SQLDAX
SELECT * FROM tEVALUATE t
WHERECALCULATETABLE, FILTER ou argumento de filtro do SUMMARIZECOLUMNS
GROUP BY + agregaçãoSUMMARIZECOLUMNS com medidas
JOINNão precisa: os relacionamentos do modelo fazem o papel
SELECT DISTINCTVALUES, DISTINCT ou SUMMARIZE só com colunas
TOP nTOPN
ORDER BYORDER BY
OFFSET / paginaçãoSTART AT

1. Consultas simples

1 — SELECT *:

Texto
SELECT * FROM dbo.TabFatVendaCamiseta;
DAX
EVALUATE
    'Vendas Camisetas'

2, 3 e 4 — ORDER BY (uma coluna, várias colunas, DESC):

Texto
SELECT * FROM dbo.TabFatVendaCamiseta
ORDER BY NumeroNotaFiscal ASC, ItemNotaFiscal DESC;
DAX
EVALUATE
    'Vendas Camisetas'
ORDER BY
    'Vendas Camisetas'[Número da Nota Fiscal] ASC,
    'Vendas Camisetas'[Item da Nota Fiscal] DESC

6 — WHERE com AND e IN:

Texto
SELECT * FROM dbo.TabFatVendaCamiseta
WHERE SiglaTamanho = 'EG' AND CodigoModelagem IN ('M', 'U');
DAX
EVALUATE
    CALCULATETABLE (
        'Vendas Camisetas',
        'Vendas Camisetas'[Sigla do Tamanho] = "EG",
        'Vendas Camisetas'[Código da Modelagem] IN { "M", "U" }
    )

Cada condição vira um argumento de filtro. Filtrar coluna é mais leve que FILTER sobre a tabela inteira.

8 — TOP N:

Texto
SELECT TOP 100 * FROM dbo.TabFatVendaCamiseta ORDER BY ValorFaturado DESC;
DAX
EVALUATE
    TOPN ( 100, 'Vendas Camisetas', 'Vendas Camisetas'[Valor Faturado], DESC )
ORDER BY 'Vendas Camisetas'[Valor Faturado] DESC

TOPN escolhe as linhas pela ordem do próprio argumento. O ORDER BY só ordena o resultado — sem ele, a saída não tem ordem garantida.

9 — Paginação com START AT:

Texto
SELECT * FROM dbo.TabFatVendaCamiseta
WHERE NumeroNotaFiscal >= '008080'
ORDER BY NumeroNotaFiscal;
DAX
EVALUATE
    'Vendas Camisetas'
ORDER BY 'Vendas Camisetas'[Número da Nota Fiscal]
START AT "008080"

Atenção START AT traz um valor constante para cada coluna do ORDER BY, na mesma ordem e com o mesmo tipo.

2. Agrupamento com medidas

5 — GROUP BY com JOIN:

Texto
SELECT c.Ano, c.NumeroMes,
       SUM(f.QuantidadeCamiseta) AS Camisetas,
       SUM(f.ValorFaturado)      AS Faturado
FROM dbo.TabFatVendaCamiseta AS f
JOIN dbo.TabDimCalendario    AS c ON f.DataVenda = c.Data
GROUP BY c.Ano, c.NumeroMes
ORDER BY c.Ano, c.NumeroMes;
DAX
EVALUATE
    SUMMARIZECOLUMNS (
        'Calendário'[Ano],
        'Calendário'[Mês #],
        "Camisetas", [Total de Camisetas],
        "Faturado", [Total Faturado]
    )
ORDER BY
    'Calendário'[Ano],
    'Calendário'[Mês #]

O JOIN some: o relacionamento 'Vendas Camisetas'[Data da Venda] → 'Calendário'[Data] já existe no modelo.

Atenção Classificar por coluna não vale na consulta. Para ordenar pelo nome do mês, inclua 'Calendário'[Mês #] e use-o no ORDER BY.

7 — GROUP BY com WHERE:

Texto
SELECT c.Ano, c.NumeroMes,
       SUM(f.QuantidadeCamiseta) AS [Camisetas EG, M&U],
       SUM(f.ValorFaturado)      AS [Faturado EG, M&U]
FROM dbo.TabFatVendaCamiseta AS f
JOIN dbo.TabDimCalendario    AS c ON f.DataVenda = c.Data
WHERE f.SiglaTamanho = 'EG' AND f.CodigoModelagem IN ('M', 'U')
GROUP BY c.Ano, c.NumeroMes
ORDER BY c.Ano, c.NumeroMes;
DAX
EVALUATE
    SUMMARIZECOLUMNS (
        'Calendário'[Ano],
        'Calendário'[Mês #],
        TREATAS ( { "EG" }, 'Vendas Camisetas'[Sigla do Tamanho] ),
        TREATAS ( { "M", "U" }, 'Vendas Camisetas'[Código da Modelagem] ),
        "Camisetas EG, M&U", [Total de Camisetas],
        "Faturado EG, M&U", [Total Faturado]
    )
ORDER BY
    'Calendário'[Ano],
    'Calendário'[Mês #]

Os filtros do SUMMARIZECOLUMNS vêm antes das medidas. TREATAS filtra só a coluna; FILTER ( 'Vendas Camisetas', ... ) materializaria a tabela fato inteira.

10 — SELECT DISTINCT:

Texto
SELECT DISTINCT NomeEstampa FROM dbo.TabFatVendaCamiseta;
DAX
EVALUATE
    VALUES ( 'Vendas Camisetas'[Nome da Estampa] )

SUMMARIZE ( 'Vendas Camisetas', 'Vendas Camisetas'[Nome da Estampa] ) dá o mesmo resultado e serve para combinar várias colunas.

11 — GROUP BY por uma coluna:

Texto
SELECT NomeEstampa,
       SUM(QuantidadeCamiseta) AS Camisetas,
       SUM(ValorFaturado)      AS Faturado
FROM dbo.TabFatVendaCamiseta
GROUP BY NomeEstampa
ORDER BY NomeEstampa;
DAX
EVALUATE
    SUMMARIZECOLUMNS (
        'Vendas Camisetas'[Nome da Estampa],
        "Camisetas", [Total de Camisetas],
        "Faturado", [Total Faturado]
    )
ORDER BY 'Vendas Camisetas'[Nome da Estampa]

12 — GROUP BY com filtro:

Texto
SELECT NomeEstampa,
       SUM(QuantidadeCamiseta) AS [Camisetas EG, M&U],
       SUM(ValorFaturado)      AS [Faturado EG, M&U]
FROM dbo.TabFatVendaCamiseta
WHERE SiglaTamanho = 'EG' AND CodigoModelagem IN ('M', 'U')
GROUP BY NomeEstampa
ORDER BY NomeEstampa;
DAX
EVALUATE
    SUMMARIZECOLUMNS (
        'Vendas Camisetas'[Nome da Estampa],
        TREATAS ( { "EG" }, 'Vendas Camisetas'[Sigla do Tamanho] ),
        TREATAS ( { "M", "U" }, 'Vendas Camisetas'[Código da Modelagem] ),
        "Camisetas EG, M&U", [Total de Camisetas],
        "Faturado EG, M&U", [Total Faturado]
    )
ORDER BY 'Vendas Camisetas'[Nome da Estampa]

3. SUMMARIZE ou SUMMARIZECOLUMNS?

Padrão da casa: SUMMARIZE só para agrupar colunas (como o SELECT DISTINCT). Para calcular valores por grupo, SUMMARIZECOLUMNS com medidas, como nas consultas 5, 7, 11 e 12. É a função que a consulta rápida Evaluate gera.

DAX
// Evite: medida calculada dentro do SUMMARIZE
EVALUATE
    SUMMARIZE (
        'Vendas Camisetas',
        'Vendas Camisetas'[Nome da Estampa],
        "Faturado", [Total Faturado]
    )

Atenção Diferença de resultado: SUMMARIZECOLUMNS remove as linhas em que todas as expressões dão BLANK. SUMMARIZE mantém o grupo mesmo sem valor. Se precisar da linha vazia, envolva todas as expressões em IGNORE ou use ADDCOLUMNS ( VALUES ( ... ), ... ).

Fontes

Conhecer a trilha Power BI ao vivo