2009-11-05 15 views
7

Diciamo che ho alcuni dei dati, sia in una tabella di SQL Server 2008 o di un [tavolo] variabile -typed:Utilizzando PIVOT in SQL Server 2008

author_id  review_id  question_id  answer_id 
88540   99001   1    719 
88540   99001   2    720 
88540   99001   3    721 
88540   99001   4    722 
88540   99001   5    723 
36414   24336   1    302 
36414   24336   2    303 
36414   24336   3    304 
36414   24336   4    305 
36414   24336   5    306 

Voglio recuperare i dati come un insieme di risultati si presenta così:

author_id  review_id  1  2  3  4  5 
88540   99001   719 720 721 722 723 
36414   24336   302 303 304 305 306 

ho il sospetto che l'operatore PIVOT è quello che ho bisogno (secondo this post, comunque), ma io non riesco a capire come iniziare, soprattutto quando il numero di question_id righe la tabella può variare. Nell'esempio sopra, è 5, ma in un'altra query la tabella potrebbe essere popolata con 7 domande distinte.

risposta

9

In realtà, sarebbe meglio farlo nel client. Supponiamo che tu stia utilizzando Reporting Services, ottieni i dati secondo il tuo primo set di risultati e visualizzali utilizzando una matrice, con author_id e review_id nel gruppo di righe, question_id nel gruppo di colonne e MAX (answer_id) nel mezzo.

Una query è fattibile, ma al momento avresti bisogno di SQL dinamico.

... qualcosa di simile:

DECLARE @QuestionList nvarchar(max); 
SELECT @QuestionList = STUFF(
(SELECT ', ' + quotename(question_id) 
FROM YourTable 
GROUP BY question_id 
ORDER BY question_id 
FOR XML PATH('')) 
, 1, 2, ''); 

DECLARE @qry nvarchar(max); 
SET @qry = ' 
SELECT author_id, review_id, ' + @QuestionList + 
FROM (SELECT author_id, review_id, question_id, answer_id 
     FROM YourTable 
    ) 
PIVOT 
(MAX(AnswerID) FOR question_id IN (' + @QuestionList + ')) pvt 
ORDER BY author_id, review_id;'; 

exec sp_executesql @qry; 
+0

Questo sembra essere quello di cui ho bisogno. Farò un tentativo e riferire - grazie! –

+1

Si prega di tenere presente la sottoquery. Se si utilizza semplicemente "SELECT * FROM YourTable", tutte le altre colonne coinvolte influiranno sul raggruppamento implicito fornito dalla funzione PIVOT. E se avete errori, commentate la riga 'exec', sostituendola con' select @ qry' –

+0

Non uso mai più [SELECT *] - ho sempre indicato esplicitamente le colonne che accedo - in modo che non sia un problema. E sì, stavo usando [select @qry] per un po 'in modo che potessi vedere/eseguire il debug dell'istruzione SQL genera prima che funzionasse. Il tuo codice ha funzionato come promesso - grazie mille per il tuo aiuto! –

0
select * 
from @t pivot 
(
    max(answer_id) for question_id in ([1],[2],[3],[4],[5]) 
) pivotT 

L'unico modo per variare la lista ([1], [2], [3], [4], [5]) sarebbe costruire questa ricerca in una stringa (dinamicamente) e quindi eseguire esso.

3

Here avete grande esempio e una spiegazione.

Nel tuo caso sarebbe come questo:

SELECT author_id, review_id, [1], [2], [3], [4], [5] 
FROM 
    (
     SELECT author_id, review_id, question_id, answer_id 
     FROM the_table 
    ) up 
PIVOT (MAX(answer_id) FOR question_id IN ([1],[2],[3],[4],[5])) AS pvt 
0

Vedi this answer

In sostanza, si pre-esaminare i dati per ottenere le colonne e quindi generare dinamicamente l'SQL utilizzando l'elenco di rotazione dinamica. Non c'è davvero alcun modo non dinamico, perché la definizione delle colonne nel set che si desidera restituire non è fissa.

2
SELECT author_id, review_id, [1], [2], [3], [4], [5] 
FROM 
    (
     SELECT author_id, review_id, question_id, answer_id 
     FROM the_table 
    ) up 
PIVOT (MAX(answer_id) FOR 
Problemi correlati