Banco de Dados - SQL Server

Pivot Table no SQL Server 2000: Criando um cross-tab report

Este artigo apresenta uma forma de se construir um relatório de referência cruzada, facilitando a visualização e a compreensão das informações, utilizando os recursos do SQL Server 2000.

por Winicius Pereira



1. Introdução

É sabido que na maioria das vezes, os sistemas de gestão não suprem em 100% das necessidades de uma organização. Quando se fala em relatórios gerenciais, sempre existe uma equipe de programadores para desenvolver reports que não estão inclusos no aplicativo, pois as necessidades de análise mudam constantemente. Sendo assim, retirar de um banco de dados uma listagem de informações e denominá-las "relatório", é muito comum na maioria das empresas. Porém, existem alguns recursos interessantes de visualização destes "relatórios", tornando-os mais facilmente compreendidos.

Este artigo apresenta uma forma de se construir um relatório de referência cruzada, facilitando a visualização e a compreensão das informações, utilizando os recursos do SQL Server 2000.

2. Cross-Tab Report

Relatório de tabela cruzada, nada mais é do que modificar a forma de visualização das informações. Elas são apresentadas em formato de uma matriz, onde algumas linhas são transformadas em colunas.

Em versões mais novas do SQL Server, como o SQL 2005, existem algumas funções já desenvolvidas pela Microsoft, o que facilita e muito a geração de tais relatórios neste formato. Um exemplo é a função PIVOT. Porém, no SQL 2000, amplamente difundido e utilizado, estas funcionalidades não estão presentes, forçando os administradores de banco de dados, a usar sua criatividade para obter o mesmo resultado.

3. Consultas e Listagens

A maioria das consultas executadas diretamente na base de dados, como objetivo de recuperar as informações, são retiradas em formato de listagens simples. Para exemplificar, considere a estrutura de dados criada em um banco de dados e representado pela figura 1.


Figura 1 - DER de Alunos matriculados em disciplinas

Continuando o exemplo, considere ainda que as tabelas foram preenchidas com os dados fictícios, conforme demonstra as figuras que se seguem:


Figura 2 - Dados da tabela TB_ALUNO


Figura 3 - Dados da tabela TB_DISCIPLINA


Figura 4 - Dados da tabela TB_MATRICULA

Caso se queira saber de forma mais clara quais disciplinas os alunos estão matriculados, uma consulta utilizando join simples entre as 3 tabelas pode resolver, conforme figura 5.


Figura 5 - Bloco de Comando SQL

O resultado da execução do bloco de comando SQL é uma listagem demonstrando o nome do aluno e a respectiva disciplina na qual ele está matriculado, conforme figura 6.


Figura 6 - Disciplinas matriculada pelos Alunos

Apesar de apresentar o resultado esperado, o mesmo não é muito eficaz em sua visualização, pois se consegue ver com clareza as disciplinas dos alunos, porém, listar todos os alunos de determinada disciplina, requer uma nova execução da consulta, alterando-se a cláusula de ordenação para 2.

Para a geração deste relatório mais amigável, é necessária a utilização do recurso de CURSOR e a função EXECUTE que não será explicado neste artigo, pois foge o seu escopo.

O código criado, lista o nome dos alunos em formato de linha e suas disciplinas em formato de colunas. Desta forma, caso seja adicionada mais disciplinas na tabela TB_DISCIPLINA, o código de geração do relatório não será alterado, pois o mesmo "monta" as colunas de forma dinâmica, ou seja, depende do número de disciplinas cadastradas na tabela

3.1 Código PIVOT - SQL 2000

Primeiramente são declaradas as variáveis que serão utilizadas para a construção do comando que será executado, conforme figura 7.


Figura 7 - Declaração de variáveis

A variável @STR foi inicializada com um valor de "espaço vazio". Fez-se necessário esta inicialização, pois no momento de sua declaração, a mesma recebe o valor NULL (nulo), e se torna impossível a concatenação de uma do número de disciplinas cadastradas na tabela.

Em seguida, é declarado um cursor com a lista dos identificadores (códigos) e abreviaturas das disciplinas cadastradas, conforme figura 8.


Figura 8 - Utilização de um laço da tabela disciplina em forma de Cursor

A seguir é feita uma concatenação de strings da seguinte forma, demonstrada na figura 9:
  • A variável @STR recebe um novo valor a cada iteração do cursor;
  • A variável @STR recebe um valor de concatenação de strings formado a partir de dados contidos nas variáveis do cursor;
  • O resultado ao final de todas as iterações são as colunas que serão listadas, ou seja, as disciplinas;
  • Para cada disciplina matriculada, será acrescentado um valor "X", demonstrando que o aluno foi matriculado nesta disciplina.


Figura 9 - Concatenação de strings na variável @STR

Após a variável @STR receber alguns valores, o cursor é fechado e é montado o comando SQL final que será executado, resultando no relatório, conforme figura 10.


Figura 10 - Fecha-se o cursor e monta-se o comando na variável @STR

Implicitamente, ao final de todas as iterações, o comando final é montado. Este comando está demonstrado na figura 11, porém, o mesmo pode variar conforme a quantidade de registros contidos na tabela TB_DISIPLINA.


Figura 11 - Comando armazenado na variável @STR

Ao final de todas as iterações o comando é executado conforme o comando EXECUTE demonstrado na figura 12.


Figura 12 - Execução do comando contido na variável @STR

Na figura 13 é demonstrado o resultado do relatório gerado. Note a facilidade de entendimento das informações em relação ao mesmo relatório listado anteriormente na figura 6. Neste, é clara a percepção e análise das disciplinas cursadas pelos alunos, bem como os alunos que estão matriculados em cada disciplina.


Figura 13 - Relatório Final Gerado.

Foi optado por listar a abreviatura de cada disciplina, e não seu nome completo, para simplesmente melhorar a estética do relatório produzido, mas nada impede que seja listado o nome, caso desejar. O código completo é demonstrado na figura 14.


Figura 14 - Código SQL completo para geração da PIVOT TABLE

4. Conclusão

Conclui-se que a criação de um relatório de referência cruzada facilita a interpretação da informação e torna sua visualização mais clara e abrangente. Contudo, não é aconselhável utilizar esta estrutura para alguns tipos de relatórios, pois além da dificuldade de concatenação das strings, deve-se levar em consideração o custo do servidor para executar um cursor.

Também vale a pena ressaltar que a partir do SQL Server 2005, esta funcionalidade já é implementada, de forma nativa e aconselha-se utilizá-la.
Winicius Pereira

Winicius Pereira