Colunas calculadas com base em condições
Ao calcular colunas, você pode querer resultados diferentes de uma expressão, dependendo de determinadas condições serem atendidas ou não. Condições podem ser configuradas em expressões usando as funções lógicas If() ouCase().
If()
Ao usar a função If(), você especifica uma condição True ou False, seguida pelo conteúdo a ser retornado dependendo dessa condição.
Exemplos
A expressão
If(([Amount]<10),"low","high")
significa que, se um valor de linha na coluna 'Amount' for inferior a 10, o valor 'low' será retornado como resultado, mas, se o valor for 10 ou superior, o valor 'high' será retornado.
Isso é ilustrado abaixo:
Em outras palavras, a função If() divide as linhas em dois grupos: um formado pelas linhas para as quais a condição especificada é True (retornando 'low' como resultado) e o outro formato pelas linhas para as quais a condição especificada é False (retornando 'high' como resultado).
Se os valores a serem retornados forem valores agregados, os dois grupos serão tratados separadamente. Isso é exemplificado na tabela abaixo pela expressão adicionada
If(([Amount]<10),Avg([Amount]),Avg([Amount]))
que contém as agregações médias. Nesse caso, a mesma agregação é especificada para ambos os grupos, mas diferentes agregações podem ser usadas.
Para os valores de linha inferiores a 10, que é o grupo 'true', a média de 6 é retornada ((5+7)/2) e, para o grupo 'false', a média de 13 ((14+10+15)/3).
A função if() também pode ser usada em combinação com and ou or. Para ilustrar, a expressão
If(([Customer age]<20) and ([Gender]="Female"),"girl","other")
resulta na coluna calculada adicionada abaixo:
Case()
Se quiser escrever uma expressão cujos resultados de condição não estejam restritos a True e False, você poderá usar a função case(). Case() pode ser usada em dois formatos diferentes, ambos descritos a seguir com o uso de exemplos.
Exemplo 1
Suponha que os preços dos livros e vídeos abaixo tenham sido reduzidos em 10% e 50%, respectivamente, e a lista de preços precise de uma atualização.
Como a redução é diferente dependendo do tipo de produto, uma expressão case() é usada para calcular os novos preços:
case [Type] when "Book" then [Price]*0.9 when "Video" then [Price]*0.5 else [Price] end
Aqui case() simplesmente verifica 'Type' contra cada uma das opções de when na expressão.
Exemplo 2
No segundo exemplo, case() é usado para avaliar os resultados de teste para um número de alunos. Existem três níveis de avaliação; Failed (total menos de 100), Passed e Excellent (total de 160 ou mais).
Neste exemplo, Case() avalia as condições de forma independente para cada uma das opções de when:
case when ([Test A] + [Test B])<100 then "Failed" when ([Test A] + [Test B])>=160 then "Excellent" else "Passed" end
Dessa forma, é possível implementar condições mais complexas do que as do exemplo 1.
A coluna calculada resultante é mostrada abaixo:
Ordem de execução das condições
A execução das diferentes partes das expressões case() é feita na ordem de cima para baixo. Veja a expressão abaixo e a coluna resultante:
case when [Number]<40 then "yes" when [Number]<70 then "no" else "x" end
Ou seja, os números abaixo de 40 são definidos como 'yes' e não serão alterados. A próxima parte da expressão, definir números abaixo de 70 como 'no', afeta apenas as linhas restantes.