Consulta de referência cruzada

SQL

Consulta de referência cruzada no SQL

Hoje vamos ver um modo simples para criarmos uma consulta de referência cruzada no SQL. Só uma observação: o banco que uso é o MS-SQL 2005.

Cenário
Imaginemos que você criou, na empresa, uma aplicação de pesquisa de satisfação para medir o desempenho da unidade que você trabalha, por exemplo, a área de Marketing. Foi desenhado todo o processo da pesquisa, quem responderia e tudo mais.

Ficou decidido que o banco de dados armazenaria informações entre 1 e 6, onde 1 para “não tenho perspectivas para opinar” e 6 para “excelente ou satisfeitíssimo”.

Um dos problemas que tive para realizar uma atividade semelhante foi a construção de uma consulta de referência cruzada. Vi na internet diversas formas para tal: consulta que cria tabelas temporárias… criar tabelas para armazenar valores e outras consultas para criar novas tabelas e mais consultas para criar tabelas… Enfim, muitas coisas, mas nada prático.

E o que fiz então:

Criar tabela onde as respostas seriam armazenadas:

CREATE TABLE [dbo].[tRespostas](
[id] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, –usuário/ip (controle para não responderem diversas vezes)
[anomesref] [nvarchar](4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, –anomes de referência
[item01] [numeric](1, 0) NULL, –questão 1
[item02] [numeric](1, 0) NULL,–questão 2
[item03] [numeric](1, 0) NULL –questão 3
) ON [PRIMARY]

Populando a tabela:

 

Tabela

Executando a consulta…

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

SELECT anoMesRef, COUNT(anoMesRef) as tRespostas, –total de respostas
/*QUESTÃO 01*/
COUNT(CASE WHEN item01 = 1 THEN (item01) END) AS [tItem01_01],–conta respostas = 1
COUNT(CASE WHEN item01 = 2 THEN (item01) END) AS [tItem01_02],–conta respostas = 2
COUNT(CASE WHEN item01 = 3 THEN (item01) END) AS [tItem01_03],–conta respostas = 3
COUNT(CASE WHEN item01 = 4 THEN (item01) END) AS [tItem01_04],–conta respostas = 4
COUNT(CASE WHEN item01 = 5 THEN (item01) END) AS [tItem01_05],–conta respostas = 5
COUNT(CASE WHEN item01 = 6 THEN (item01) END) AS [tItem01_06],–conta respostas = 6

/*QUESTÃO 02*/
COUNT(CASE WHEN item01 = 1 THEN (item02) END) AS [tItem02_01],–conta respostas = 1
COUNT(CASE WHEN item01 = 2 THEN (item02) END) AS [tItem02_02],–conta respostas = 2
COUNT(CASE WHEN item01 = 3 THEN (item02) END) AS [tItem02_03],–conta respostas = 3
COUNT(CASE WHEN item01 = 4 THEN (item02) END) AS [tItem02_04],–conta respostas = 4
COUNT(CASE WHEN item01 = 5 THEN (item02) END) AS [tItem02_05],–conta respostas = 5
COUNT(CASE WHEN item01 = 6 THEN (item02) END) AS [tItem02_06],–conta respostas = 6

/*QUESTÃO 03*/
COUNT(CASE WHEN item01 = 1 THEN (item03) END) AS [tItem03_01],–conta respostas = 1
COUNT(CASE WHEN item01 = 2 THEN (item03) END) AS [tItem03_02],–conta respostas = 2
COUNT(CASE WHEN item01 = 3 THEN (item03) END) AS [tItem03_03],–conta respostas = 3
COUNT(CASE WHEN item01 = 4 THEN (item03) END) AS [tItem03_04],–conta respostas = 4
COUNT(CASE WHEN item01 = 5 THEN (item03) END) AS [tItem03_05],–conta respostas = 5
COUNT(CASE WHEN item01 = 6 THEN (item03) END) AS [tItem03_06]–conta respostas = 6

FROM tRespostas
WHERE anomesRef = ‘0707’ –ano 07 e mês 07
GROUP BY anoMesRef

Resultado da pesquisa:

Resultado

 

Obs.: Resultado considerando apenas o retorno do ITEM 01.

Autor : Ricardo SantAnna é formado em Sistemas de Informação pela Universidade de Santo Amaro e trabalha atualmente na SABESP, em Itapetininga, na Gestão Comercial e Marketing e tem como uma das atribuições o desenvolvimento de aplicações de controle e acompanhamento de processos.