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.
| SQL | DAX |
|---|---|
SELECT * FROM t | EVALUATE t |
WHERE | CALCULATETABLE, FILTER ou argumento de filtro do SUMMARIZECOLUMNS |
GROUP BY + agregação | SUMMARIZECOLUMNS com medidas |
JOIN | Não precisa: os relacionamentos do modelo fazem o papel |
SELECT DISTINCT | VALUES, DISTINCT ou SUMMARIZE só com colunas |
TOP n | TOPN |
ORDER BY | ORDER BY |
OFFSET / paginação | START AT |
1. Consultas simples
1 — SELECT *:
SELECT * FROM dbo.TabFatVendaCamiseta;
EVALUATE
'Vendas Camisetas'
2, 3 e 4 — ORDER BY (uma coluna, várias colunas, DESC):
SELECT * FROM dbo.TabFatVendaCamiseta
ORDER BY NumeroNotaFiscal ASC, ItemNotaFiscal DESC;
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:
SELECT * FROM dbo.TabFatVendaCamiseta
WHERE SiglaTamanho = 'EG' AND CodigoModelagem IN ('M', 'U');
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:
SELECT TOP 100 * FROM dbo.TabFatVendaCamiseta ORDER BY ValorFaturado DESC;
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:
SELECT * FROM dbo.TabFatVendaCamiseta
WHERE NumeroNotaFiscal >= '008080'
ORDER BY NumeroNotaFiscal;
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:
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;
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:
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;
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:
SELECT DISTINCT NomeEstampa FROM dbo.TabFatVendaCamiseta;
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:
SELECT NomeEstampa,
SUM(QuantidadeCamiseta) AS Camisetas,
SUM(ValorFaturado) AS Faturado
FROM dbo.TabFatVendaCamiseta
GROUP BY NomeEstampa
ORDER BY NomeEstampa;
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:
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;
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.
// 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 ( ... ), ... ).