Tableau e Functions
Autor: Diogo Roos | Publicado: 2015-01-09T16:35:00-02:00


Nesse post vou comentar sobre duas funcionalidades do Tableau.
A versão utilizada é a 8.3.

- Colorização de linhas para intervalo de medidas/cálculos.
Imagine que você precisa destacar os resultados através de cores em sua planilha.
Por exemplo: você tem uma planilha com 200 linhas e quatro colunas:
&gt; Produto &nbsp;#Quantidade vendida #Valor de venda #Total

Então você precisa destacar as linhas em que a coluna Total teve determinados valores, tais como:
&lt; 1.000 com cor vermelho
&gt;= 1.000 e &lt; 10.000 com amarelo
&gt; 10.000 e &lt; 50.000 com azul
&gt;= 50.000 com verde

Seria fácil fazer isso apenas arrastando a coluna Total para a paleta/opção Cor do painel (cartão) de Marcas.











Entretanto, ao arrastar a medida Total para lá, o Tableau irá gerar uma cor para cada uma das 200 linhas, pois em geral, cada linha de produto deve ter seu Total único. Isso seria útil se você quisesse destacar os produtos em cores, pois cada um dos 200 teriam cores distintas.
Mas a ideia é "agrupar" e definir as cores como nos 3 intervalos que citei acima.
Para isto, faça o seguinte: crie uma nova dimensão com nome Cores e edite a fórmula desta maneira:
IF [Total] &lt; 1000 THEN "Vermelho"
&nbsp; ELSEIF ([Total]&nbsp;&gt;= 1000 AND [Total]&nbsp;&lt; 10000) THEN "Amarelo"
&nbsp; ELSEIF ([Total]&nbsp;&gt;10000 AND&nbsp;[Total]&nbsp;&lt; 50000) THEN "Azul"
&nbsp; ELSEIF [Total]&nbsp;&gt;= 50000 THEN "Verde"
END
Pronto! Agora basta arrastar a nova "dimensão" Cores para a opção Cor do painel de Marcas e editar as cores de acordo com as opções disponíveis.
Caso nesta lista de 200 linhas você não tenha um dos casos, como o verde, por exemplo, ele não irá aparecer na janela de edição de cores para você apontar que "Verde" trata-se da cor verde, e não de lilás, que o Tableau gerou automaticamente. Neste caso, para "ensinar" ao Tableau qual cor deve ser quando ultrapassar 50.000, isto é, quando Cores retornar "Verde", você pode criar uma nova medida com base no Total e multiplicar por um valor x, até que tal valor ultrapasse 50.000, e então você modifica a regra acima para algo semelhante a:
&nbsp; ELSEIF ([Total]&nbsp;&gt;= 50000 OR&nbsp;[Total]+50000&nbsp;&gt;= 50000) THEN "Verde"
Desta forma o "Verde" também irá aparecer na janela de edição de cores, então bastará apontar que "Verde" é verde.

Uma coisa que o pessoal da Tableau podia implementar é fazer com que a dimensão retornasse a própria cor em hexadecimal ou rgb. Desta forma não seria preciso fazer essa ligação de "retorno da dimensão com cor".

- Parâmetros em consultas.
De modo básico, o parâmetro não representa grande coisa diante do filtro.
Não faz muito sentido utilizar parâmetros como filtros quando se utiliza "SQL Personalizado". O usuário pode utilizar os filtros na análise posteriormente, sem que seja necessário criar parâmetros para isso.
Além disto, ao publicar uma pasta de trabalho no servidor web Tableau, você não tem a opção de disponibilizar pré-filtros de parâmetros para os usuários filtrarem as informações antes de abrir a visão na web. Isso só é possível com dimensões filtráveis, e não com parâmetros.
Nessa concepção, os parâmetros parecem não ter grande utilidade, certo? -essa é a parte que digo: errado!

Humm... espera, não está errado não. De modo básico, os parâmetros não tem grande utilidade mesmo.

A não ser que você utilize functions. Aí o cenário muda e quem manda é o parâmetro, não o filtro.
Se você tem uma function (pipelined no Oracle, ou Tabled-valued no Sql Server), para a questão de desempenho não importa o filtro que utilize, demorará tanto quanto se estivesse sem filtro.

Veja a imagem mais abaixo.

No select há uma function (FPLAREA) que possui alguns parâmetros. Os parâmetros de uma function podem ser utilizados como filtros where, porém de maneira diferente daqueles filtros indicados após o where, que no caso do select da imagem seria 'Planejado Vs Realizado' where NumAno &nbsp;= '2015'.
Por exemplo: nesta função eu faço várias consultas SQL e alguns somatórios.
No primeiro select/consulta existem as colunas de Ano e Produto, fora as colunas de valores.
Eu posso passar o ano, ou o produto ou ambos nos parâmetros da function, que neste caso irá incluir os where's no select da primeira consulta dentro dessa function. Se eu não passar nenhum parâmetro, os select's dentro da function só não terão os where's.





















A ideia de parâmetros na function é semelhante a isto:
CREATE FUNCTION FPLAREA (@NumAno VARCHAR(4), @CodPro VARCHAR(20)...
DECLARE&nbsp;@VLRPLA Numeric(11,2),&nbsp;@QTDPLA Numeric...

--E aí entram as condições de filtrar o(s) parâmetro(s) ou não
--Neste primeiro, apenas o ano foi indicado no parâmetro. Sim, é uma string porque o Tableau indicaria 0 (zero) caso o parâmetro fosse do tipo inteiro, e caso eu queira filtrar mais de um ano, seria complicado se fosse inteiro.
IF @NumAno &lt;&gt; ' ' AND @CodPro = ' ' BEGIN
&nbsp; DECLARE c140PLA CURSOR FOR&nbsp;
&nbsp; SELECT VlrPla, QtdPla FROM ...
&nbsp; &nbsp;WHERE AnoPla =&nbsp;@NumAno;
--Neste segundo caso, o ano e produto foram informados
END ELSE IF @NumAno &lt;&gt; ' ' AND @CodPro &lt;&gt; ' ' BEGIN
&nbsp; DECLARE c140PLA CURSOR FOR&nbsp;
&nbsp; SELECT VlrPla, QtdPla FROM ...
&nbsp; &nbsp;WHERE AnoPla =&nbsp;@NumAno
&nbsp; &nbsp; &nbsp;AND CodPro =&nbsp;@CodPro;
--Neste terceiro, nada foi informado
END ELSE IF&nbsp;@NumAno = ' ' AND @CodPro = ' ' BEGIN
&nbsp; SELECT VlrPla, QtdPla FROM ...;
END
...

A diferença, como eu disse, é o tempo de execução. O banco de dados não sabe o que a function pode retornar (diferentemente de uma consulta em uma tabela física), então se eu filtrar a function apenas com where, primeiro o banco irá consultar tudo que a function retorna, depois é que ele faz o filtro de todos esses dados e mostra só o que está dentro do filtro. O resultado será o mesmo, só que um será mais lento e outro mais rápido.

Por isso que a consulta da function ficará mais rápida com parâmetros do que com filtros.

Se sua plataforma de BI não consulta os dados em tempo real, dê uma lida neste post.
Se você já trabalha com dados online em sua plataforma, é possível que venha utilizar function's, caso ainda não use.