Consulta SQL usando tabela dinâmica

Hoje quero falar sobre tecnologia, mas especificamente sobre consultas a banco de dados utilizando a linguagem SQL.

Durante meu curso de Sistemas de Informação, na disciplina de Banco de Dados, tive um professor que era extremamente entusiasta dessa ferramenta, não sem razão. É possível fazer muita coisa com ela, sabendo usar corretamente. A maioria dos que usam SQL não passa dos SELECTs, INNER JOINs, LEFT JOINs e assim por diante, mas ela oferece muito mais do que isso. Uma analogia que me satisfaz é dizer que SQL compara-se a um canivete suíço, se você não sabe usar, vai utilizá-lo somente para cortar outros objetos, mas se explorá-lo um pouco mais, vai descobrir que ele só não fala porque precisaria de baterias :D.

Vamos imaginar a seguinte situação: você tem uma tabela com todas as vendas realizadas pela empresa, com a seguinte disposição (vamos chamá-la de ITEM_VENDA):

---------------------------------------------------
| Produto | Quantidade | Valor       | Data       |
---------------------------------------------------
| P1      |       1,00 |      350,00 | 05/01/2017 |
| P2      |       1,00 |     1200,00 | 09/01/2017 |
| P1      |       3,00 |      900,00 | 25/01/2017 |
| P1      |       2,00 |      500,00 | 01/02/2017 |
| P1      |       5,00 |     1300,00 | 04/02/2017 |
| P2      |       3,00 |     3000,00 | 04/02/2017 |
| P2      |       3,00 |     2900,00 | 16/02/2017 |
| P2      |       1,00 |     1100,00 | 17/02/2017 |
| P2      |      10,00 |    10000,00 | 20/02/2017 |
---------------------------------------------------

Temos dois produtos (P1 e P2) que foram vendidos nos dois primeiros meses de 2017, com valores distintos. O gerente de vendas precisa saber quanto foi vendido de cada produto em cada mês do ano, para fazer uma comparação. A estrutura do relatório deverá ser:

-----------------------------------------------------------
| Produto | Quant_Jan | Valor_Jan | Quant_Fev | Valor_Fev |
-----------------------------------------------------------

Existem diversas formas de montar o relatório, mas a que mais me agrada é a utilização de tabelas dinâmicas, que são criadas em tempo de execução. Para o Microsofr SQL Server, o script seria:

WITH ITEM_JAN AS (
 SELECT Produto, SUM(Quantidade) AS Quant_Jan, SUM(Valor) AS Valor_Jan
 FROM ITEM_VENDA
 WHERE Month(Data) = 1
 GROUP BY Produto
), ITEM_FEV AS (
 SELECT Produto, SUM(Quantidade) AS Quant_Fev, SUM(Valor) AS Valor_Fev
 FROM ITEM_VENDA
 WHERE Month(Data) = 2
 GROUP BY Produto
)

SELECT ITEM_JAN.Produto, Quant_Jan, Valor_Jan, Quant_Fev, Valor_Fev
FROM ITEM_JAN
 INNER JOIN ITEM_FEV ON ITEM_JAN.Produto = ITEM_FEV.Produto
ORDER BY ITEM_JAN.Produto

O resultado da consulta seria:

-----------------------------------------------------------
| Produto | Quant_Jan | Valor_Jan | Quant_Fev | Valor_Fev |
-----------------------------------------------------------
| P1      |      4,00 |   1250,00 |      7,00 |   1800,00 |
| P2      |      1,00 |   1200,00 |     17,00 |  17000,00 |
-----------------------------------------------------------

Explicando resumidamente, o que fiz foi criar duas tabelas (ITEM_JAN e ITEM_FEV) dinamicamente, ou seja, elas não existem no banco de dados, apenas na memória, enquanto o script está sendo executado. Porém, ao construir a string, o SQL Management Studio interpreta como se as tabelas realmente existissem, apresentando-as na lista suspensa do autocompletar.

Outro detalhe é que usei INNER JOIN, porque houve venda de todos os produtos nos dois meses selecionados. Porém, poderia ter feito com OUTER JOIN, assim, se em um determinado mês o produto P1 não tenha sido vendido e no mês seguinte foi a vez de P2 não vender, ainda assim eles seriam apresentados no relatório, com quantidade e valor NULL (também podemos fazer um tratamento para quando isto ocorrer, apresentar zero, para facilitar a manipulação).

Conclusão

Como mencionei anteriormente, não existe apenas uma forma de chegar ao mesmo resultado, depende do conhecimento e gosto do programador. Algumas opções consomem mais recursos que outros, mas podem ser mais fáceis de serem entendidas. Apenas um DBA (Database Administrator – administrador de banco de dados) poderá dizer qual é a melhor.

Bancos de dados são recursos altamente utilizados na indústria. Seria de grande utilidade que fossem introduzidos já no ensino fundamental, como forma de praticar os ensinamentos matemáticos da teoria de grupos.

Anúncios