2009-11-05 29 views
7

でPIVOTを使用すると、変数を-typedいずれかのSQL Server 2008のテーブルまたは[テーブル]で、のは、私はいくつかのデータを持っているとしましょう: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 

私は結果セットとしてデータを取得したいですの数がで行をquestion_id場合は特に、私はPIVOT演算子は、私が(とにかく、this postに応じて)必要なものである疑いがあるが、私は開始する方法を見つけ出すことはできません

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

:次のようになりますテーブルは変わる可能性があります。上記の例では5ですが、別のクエリではテーブルには7つの異なる質問が設定されています。

答えて

9

実際には、クライアントでこれを行う方がよいでしょう。 Reporting Servicesを使用して、最初の結果セットごとにデータを取得し、行グループのauthor_idとreview_id、列グループのquestion_id、および中央のMAX(answer_id)を使用してMatrixを使用してデータを表示するとします。

クエリは実行可能ですが、動的SQLが必要です。

...のようなもの:あなたは偉大な例と説明を持っている

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

これは私が必要としているようです。私はそれをショットと報告を返すよ - ありがとう! –

+1

サブクエリを覚えておいてください。 "SELECT * FROM YourTable"だけを使用すると、PIVOT関数が提供する暗黙的なグループ化に影響する他の列が影響を受けます。エラーがあれば、 'exec'行をコメントアウトして' select @ qry'に置き換えてください。 –

+0

私は決して[SELECT *]を使用しません。問題。そして、はい、私は[select @ qry]をしばらく使用していたので、生成するSQL文が実行される前にそれを表示/デバッグできるようになりました。 あなたのコードは約束どおりに機能しました。ご協力いただきありがとうございます! –

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

リストを変更する唯一の方法([1]、[2]、[3]、[4]、[5])(動的)文字列でこのクエリを構築し、実行することであろうそれ。

3

Here

あなたのケースでは、それはこのようになります:

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

基本的にthis answer

を参照してください、あなたは列を取得し、動的に動的なピボットリストを使用してSQLを生成するためのデータを事前に点検してください。実際には非動的な方法はありません。なぜなら、戻すセット内の列の定義は固定されていないからです。

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