5

SQL Server 2008 に、マトリックスに転置したいアンケート データがあります。
同じトピックに関する投稿をいくつか見ましたが、ピボットできません。

次の表が与えられます。

Question table

Answer table

Customer table

列:
[CustomerID] , [QuestionName_1], .., [QuestionName_n]<-動的な質問列数)
データ:
CustomerID , Answer_1, ..,Answer_n

列を取得するコード:

DECLARE @columns VARCHAR(8000)

SELECT @columns = COALESCE(@columns + ',[' + cast(QuestionName as varchar) + ']',
'[' + cast(QuestionName as varchar)+ ']')
FROM Answer A 
INNER JOIN Question Q ON A.QuestionID = Q.QuestionID
INNER JOIN Customer C ON A.CustomerID = C.CustomerID
GROUP BY Q.QuestionName

SET @columns = '[CustomerID],' + @columns

DECLARE @query VARCHAR(8000)
SET @query = 'Some PIVOT query without aggregation'

EXECUTE(@query)

最初のクエリのアイデアは、動的列を使用したピボットから得られました。

それは可能で、ピボット クエリはどのようになりますか?
ps: 列の最大数でランキングを使用したくありません。

よろしく、

ミシェル

4

1 に答える 1

15

はい、動的ピボットを実行できます。PIVOTクエリと結果がどのように表示されるかを確認できるように、最初に静的バージョンを使用してクエリを作成する方が簡単な場合があります。次に、クエリを動的バージョンに変換します。

クエリの静的バージョンと動的バージョンの例を次に示します。

静的 ( SQL フィドル):

select *
from 
(
    select u.userid,
        u.fname,
        u.lname,
        u.mobile,
        r.question,
        r.choice
    from users u
    left join results r
        on u.questionid = r.questionid
        and u.choiceid = r.choiceid
) x
pivot
(
    min(choice)
    for question in([are you], [from])
) p

動的 ( SQL フィドル):

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
            FROM results c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
            (
                select u.userid,
                    u.fname,
                    u.lname,
                    u.mobile,
                    r.question,
                    r.choice
                from users u
                left join results r
                    on u.questionid = r.questionid
                    and u.choiceid = r.choiceid
           ) x
            pivot 
            (
                min(choice)
                for question in (' + @cols + ')
            ) p '


execute(@query)

現在のテーブル構造といくつかのサンプルデータに関する詳細を提供できる場合。お客様の状況に必要なバージョンの作成をお手伝いできるはずです。

前述したように、最初に変換する必要がある列をハードコーディングしてから動的バージョンに移行する静的バージョンから始める方が簡単な場合があります。

于 2012-08-16T11:14:00.960 に答える