SQL vs DAX - Filtrando registros
Compare as diversas formas de filtrar registros no SQL e no DAX
Neste artigo vamos comparar as formas de selecionar registros no SQL e no DAX utilizando critérios como strings e números.
Este é o segundo artigo de uma série comparando o SQL com o DAX. Se você perdeu o primeiro artigo, o link está aqui
SQL vs DAX - Operações Básicas
Primeiro vamos criar os dados que vamos usar como exemplo
SQL
CREATE TABLE Funcionarios (
[Nome] [varchar](50) NULL,
[Departamento] [varchar](50) NULL,
[Salario] [decimal](18, 2) NULL
)
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Madalena','Contabilidade',2500.00);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('João','TI',3000.00);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Thiago','Vendas',1500.00);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Dalilah','Contabilidade',2000.00);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Zedequias','TI',2670.18);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Lucas','Vendas',5000.00);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Daniel','Compras',4000.00);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Alberto','TI',7890.90);
INSERT INTO Funcionarios (Nome, Departamento, Salario) VALUES ('Marilena','Compras',1890.90);
DAX
Funcionarios =
DATATABLE(
"Nome", STRING,
"Departamento", STRING,
"Salario", Currency,
{
{"Madalena","Contabilidade",2500.00},
{"João","TI",3000.00},
{"Thiago","Vendas",1500.00},
{"Dalilah","Contabilidade",2000.00},
{"Zedequias","TI",2670.18},
{"Lucas","Vendas",5000.00},
{"Daniel","Compras",4000.00},
{"Alberto","TI",7890.90},
{"Marilena","Compras",1890.90}
}
)
Como primeiro exemplo, vamos ver como selecionar registros com base no nome do departamento
SQL
SELECT * FROM Funcionarios where Departamento = 'TI'
DAX
EVALUATE
FILTER ( Funcionarios, Funcionarios[Departamento] = "TI")
A função FILTER permite retornar uma tabela apenas com os registros selecionados. No primeiro parâmetro informamos a origem de dados, que no nosso caso é a tabela Funcionários. O segundo parâmetro é o criterio, onde informamos o nome da coluna e o critério de filtro desejado.
Se a nossa necessidade fosse conferir se a tabela Funcionarios possui registros com o departamento de TI, poderiamos usar a função CONTAINS
EVALUATE
{CONTAINS(Funcionarios, Funcionarios[Departamento], "TI")}
A função CONTAINS recebe como primeiro parâmetro uma origem de dados, os parâmetros seguintes são o nome da coluna e o valor desejado. Seu retorno é TRUE se a condição informada for localizada, caso contrário retorna FALSE.
Uma outra forma de filtrar todos os registros com base no nome de 1 departamento seria utilizar a função CALCULATETABLE
EVALUATE
CALCULATETABLE (
Funcionarios,
Funcionarios[Departamento] = "TI"
)
A função CALCULATETABLE recebe como primeiro parâmetro uma origem de dados e como segundo parâmetro uma condição. Seu retorno sempre será uma tabela.
Nos próximos exemplos deste artigo vamos trabalhar mais com a função FILTER.
Se você quiser retornar os funcionários que trabalham em dois departamentos sua consulta ficaria da seguinte forma:
SQL
SELECT * FROM Funcionarios WHERE Departamento in ('TI', 'Contabilidade')
DAX
EVALUATE
FILTER ( Funcionarios, Funcionarios[Departamento] IN { "TI", "Contabilidade"})
Perceba que o operador IN que utilizamos como parâmetro do FILTER tem o mesmo comportamento do SQL.
O comportamento será um pouco diferente se você quiser selecionar registros que não pertencam a um certo departamento
SQL
SELECT * FROM Funcionarios WHERE Departamento not in ('TI', 'Contabilidade')
DAX
EVALUATE
FILTER ( Funcionarios, NOT(Funcionarios[Departamento]) IN { "TI", "Contabilidade"})
Perceba que não fizemos NOT IN como foi feito no SQL. No DAX é necessário utilizar o operador NOT antes da coluna que será utilizada como referência para o IN.
Com certeza você deve estar se perguntando como fazer para selecionar registros com base em parte de uma string. No exemplo a seguir vamos selecionar nomes com base nos 2 primeiros caracteres. A forma de fazer isso no DAX é um pouco diferente do SQL.
SQL
SELECT * FROM Funcionarios where Nome like 'Da%'
DAX
EVALUATE
FILTER ( Funcionarios, LEFT(Funcionarios[Nome],2) = "Da")
Como não temos um operador LIKE foi necessário utilizar a funcão LEFT para selecionar os 2 primeiros caracteres da coluna selecionada. LEFT recebe o nome da coluna como primeiro parâmetro e a quantidade de caracteres como segundo parâmetro. Perceba que essa abordagem também funcionaria no SQL, então a seguinte consulta SQL traria os mesmos resultados
SELECT * FROM Funcionarios WHERE LEFT(Nome, 2) = 'Da'
Porém, é fácil perceber que o operador LIKE resolve este problema de forma mais fácil.
Se for necessário selecionar nomes com base nos caracteres finais a solução é parecida com o que vimos no exemplo anterior.
SQL
SELECT * FROM Funcionarios WHERE Nome like '%lena'
SELECT * FROM Funcionarios WHERE RIGHT(Nome, 4) = 'lena'
DAX
EVALUATE
FILTER ( Funcionarios, RIGHT(Funcionarios[Nome],4) = "lena")
Usamos neste exemplo a função RIGHT para selecionar os 4 últimos caracteres da coluna selecionada.
Para localizar um nome por uma string localizada em qualquer lugar do campo nome temos duas formas de chegar no resultado.
SQL
SELECT * FROM Funcionarios WHERE Nome like '%le%'
DAX
EVALUATE
FILTER ( Funcionarios, CONTAINSSTRING(Funcionarios[Nome], "le" ))
Outra forma de fazer usando DAX
EVALUATE
FILTER ( Funcionarios, SEARCH( "rra", Funcionarios[Nome], 1, 0 ) > 0)
Na primeira solução usamos a função CONTAINSSTRING. Ela recebe dois parâmetros, o primeiro é a coluna que vai servir de referência para a pesquisa e o segundo é a string que desejamos localizar.
Na segunda solução usamos a função SEARCH. Esta função recebe quatro parâmetros, o primeiro é a string que desejamos localizar. O segundo é a coluna que vai servir de referência para a pesquisa. O terceiro parâmetro é a posição inicial da busca dentro da coluna desejada e o último parâmetro é o valor a ser retornado se a string informada não for localizada. A funçao SEARCH vai retornar a primeira posição da string selecionada dentro da coluna. Por isso que no final foi inserida a comparação SEARCH()> 0.
A função FILTER aceita apenas um parâmetro de filtro. Para filtrar por mais de uma condição podemos usar operadores lógicos para agrupar os critérios ou podemos usar funções específicas. Vamos ver dois exemplos a seguir:
SQL
SELECT * FROM Funcionarios WHERE Departamento = 'TI' and Salario > 3000
DAX
EVALUATE
FILTER(Funcionarios,
AND(Funcionarios[Departamento]="TI",Funcionarios[Salario]>3000)
)
A função AND aceita várias condições e retorna TRUE se todas foram verdadeiras.
Além do AND existe a função OR que retorna FALSE se todas as condições informadas forem falsas.
SQL
SELECT * FROM Funcionarios WHERE Departamento = 'TI' OR Salario > 3000
DAX
EVALUATE
FILTER(Funcionarios,
OR(Funcionarios[Departamento]="TI",Funcionarios[Salario]>3000)
)
No próximo artigo vamos ver como podemos manipular strings