SQL vs DAX - Filtrando registros

SQL vs DAX - Filtrando registros

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

 

SQL vs DAX - Trabalhando com strings

 

Outros conteudos que podem ser de seu interesse

SQL vs Mongo - expressões regulares
22/12/2019SQL

SQL vs Mongo - expressões regulares

Veja como utilizar expressões regulares no SQL e no Mongo

Saiba mais...
Como agrupar vários registros em uma única coluna com SQL
26/06/2022SQL

Como agrupar vários registros em uma única coluna com SQL

Veja como agrupar várias linhas em uma única coluna com SQL

Saiba mais...

Conteúdo sobre banco de dados sem complicação!