Linhas SQL para Colunas

Eu tenho uma tabela e quero transpor suas linhas para colunas, semelhante a uma tabela dinâmica, mas sem resumir.

Por exemplo, tenho as seguintes tabelas:

Question --QuestionID --QuestionText Response --ResponseID --ResponseText --QuestionID 

Basicamente eu quero ser capaz de criar uma tabela dinâmica como:

 Question 1 Text | Question 2 Text | Question 3 Text --------------------------------------------------- Response 1.1 Text | Response Text 1.2 | Response 1.3 Response 2.1 Text | Response Text 2.2 | Response 2.3 Response 3.1 Text | Response Text 3.2 | Response 3.3 Response 4.1 Text | Response Text 4.2 | Response 4.3 

O principal requisito seria não saber em tempo de design qual será o texto da pergunta.

Por favor, alguém pode ajudar – eu estou puxando meu cabelo para fora: oS

Essencialmente, você pode garantir que haverá uma resposta para cada questão correspondente neste cenário.

Você não pode fazê-lo com SQL (exceto com consultas dinâmicas), a menos que você saiba o número de colunas (ou seja, perguntas) em tempo de design.

Você deve extrair os dados desejados em formato de tabela e processá-los no lado do cliente:

 SELECT * FROM Question LEFT OUTER JOIN Response ON Response.QuestionId = Question.QuestionID 

ou, provavelmente, isso (no SQL Server 2005+ , no Oracle 8i+ e no PostgreSQL 8.4+ ):

 SELECT * FROM ( SELECT q.*, ROW_NUMBER() OVER (ORDER BY questionID) AS rn FROM Question q ) q LEFT OUTER JOIN ( SELECT r.*, ROW_NUMBER() OVER (PARTITION BY questionID ORDER BY ResponseID) AS rn FROM Response r ) r ON r.QuestionId = q.QuestionID AND q.rn = r.rn ORDER BY q.rn, q.QuestionID 

A última consulta fornecerá os resultados neste formulário (desde que você tenha 4 perguntas):

 rn question response --- --- --- 1 Question 1 Response 1.1 1 Question 2 Response 2.1 1 Question 3 Response 3.1 1 Question 4 Response 4.1 2 Question 1 Response 1.2 2 Question 2 Response 2.2 2 Question 3 NULL 2 Question 4 Response 4.2 3 Question 1 NULL 3 Question 2 NULL 3 Question 3 Response 3.3 3 Question 4 NULL 

, isto é, irá mostrar os dados em forma de tabela, com rn marcando o número da linha.

Cada vez que você vê a mudança no cliente, basta fechar

e abrir o novo.

Você pode colocar com segurança a linha de um por linha de resultados de

, já que o mesmo número ou linhas têm a garantia de serem retornadas para cada rn

Esta é uma pergunta bastante freqüente.

SQL apenas não é uma ferramenta certa para retornar dados com o número dynamic de colunas.

SQL opera em conjuntos e o layout da coluna é uma propriedade implícita de um conjunto.

Você deve definir o layout do conjunto que deseja obter no tempo de design, assim como define o tipo de dados de uma variável em C

C trabalha com variables ​​estritamente definidas, SQL trabalha com conjuntos estritamente definidos.

Note que não estou dizendo que é o melhor método possível. É apenas a maneira como o SQL funciona.

Atualizar:

No SQL Server , você pode extrair a tabela em formato HTML do database:

 WITH a AS ( SELECT a.*, ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id) AS rn FROM answer a ), rows AS ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS rn FROM answer a WHERE question_id = ( SELECT TOP 1 question_id FROM answer a GROUP BY question_id ORDER BY COUNT(*) DESC ) ) SELECT ( SELECT COALESCE(a.value, '') FROM question q LEFT JOIN a ON a.rn = rows.rn AND a.question_id = q.id FOR XML PATH ('td'), TYPE ) AS tr FROM rows FOR XML PATH(''), ROOT('table') 

Veja esta input no meu blog para mais detalhes:

  • Pivô dynamic

Faça o seu agrupamento e agregação primeiro, usando a resposta do Quassnoi como um resultado intermediário.

A tabulação cruzada só deve ser feita quando você não estiver mais realizando operações orientadas para os resultados. Alguns dialetos SQL têm palavras-chave como PIVOT, TRANSFORM ou CROSSTABULATE para realizar isso, mas provavelmente é melhor usar o XSLT.

    Intereting Posts