Utilizarea PIVOT în SQL Server 2008 (Programare, Sql, Server Sql, Tsql, Sql Server 2008, Pivot)

Masa Dot Net a intrebat.

Să presupunem că am niște date, fie într-un tabel SQL Server 2008, fie într-o variabilă de tip [table]-typed:

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

Doresc să recuperez datele sub forma unui set de rezultate care arată astfel:

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

Bănuiesc că operatorul PIVOT este ceea ce am nevoie (conform acestui post, oricum), dar nu-mi dau seama cum să încep, mai ales când numărul de question_id din tabel poate varia. În exemplul de mai sus, este 5, dar într-o altă interogare tabelul ar putea fi populat cu 7 întrebări distincte.

5 răspunsuri
Rob Farley

De fapt, ar fi mai bine să faceți acest lucru în client. Să presupunem că utilizați Reporting Services, obțineți datele conform primului set de rezultate și le afișați utilizând o matrice, cu author_id și review_id în Grupul de rânduri, question_id în Grupul de coloane și MAX(answer_id) în mijloc.

O interogare este fezabilă, dar ați avea nevoie de SQL dinamic în acest moment.

ceva de genul:

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;

Comentarii

  • Aceasta pare a fi ceea ce am nevoie. Voi încerca și voi raporta… mulțumesc! –  > Por Mass Dot Net.
  • Vă rog să țineți cont de subîntrebare. Dacă folosiți doar „SELECT * FROM YourTable”, atunci orice alte coloane implicate vor afecta gruparea implicită pe care o oferă funcția PIVOT. Iar dacă aveți erori, comentați exec linie, înlocuind-o cu select @qry –  > Por Rob Farley.
  • Nu mai folosesc niciodată [SELECT *] – întotdeauna precizez în mod explicit coloanele pe care le accesez – așa că nu va fi o problemă. Și da, am folosit [select @qry] pentru o vreme, astfel încât să pot vedea/depanarea instrucțiunii SQL generate înainte de a fi executată. Codul tău a funcționat așa cum ai promis — îți mulțumesc foarte mult pentru ajutor! –  > Por Mass Dot Net.
Lukasz Lysik

Aici aveți un exemplu și o explicație excelentă.

În cazul dumneavoastră ar fi așa:

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

aaa
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

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

Singura modalitate de a varia lista ([1],[2],[3],[4],[5]) ar fi să construiți această interogare într-un șir de caractere (dinamic) și apoi să o executați.

Cade Roux

Consultați acest răspuns

Practic, inspectați în prealabil datele pentru a obține coloanele și apoi generați dinamic SQL folosind lista pivot dinamică. Nu există cu adevărat o modalitate nedinamică, deoarece definiția coloanelor din setul pe care doriți să îl returnați nu este fixată.