1

SQL Server に、Web サイトの調査からの質問と回答のリストを格納するテーブルがあります。これは非常に標準的なレイアウトです。完了した調査を保存する方法は次のとおりです。

Name          Question                        Answer
James Smith   What is your address?           23 Duck Ln.
James Smith   How old are you?                48
James Smith   Do you have a job?              yes
Sarah Murphy  What is your address?           44 West St.
Sarah Murphy  How old are you?                23
Sarah Murphy  Do you have a job?              no
Jack Western  What is your address?           PO Box 17
Jack Western  Do you have a job?              yes

ご覧のとおり、いくつかの調査が完了すると、データを読み取るのが難しくなります。値を水平方向に返す必要があります。各行には、最初の列に人の名前が含まれ、他の行にはヘッダーとして質問が含まれ、その下に回答が含まれています。クエリが値を返す方法は次のとおりです。

Name          What is your address?    How old are you?    Do you have a job?
James Smith   23 Duck Ln.              48                  yes
Sarah Murphy  44 West St.              23                  no
Jack Western  PO Box 17                                    yes

これは可能ですか?ところで、私はいくつかの質問を投稿しているだけです。サイトで 10 件以上の質問があると、さらに大きくなります。

ご協力いただきありがとうございます!

編集:

アプリケーション層でレコードを解析する必要があるかどうかに注目しないでください。最終的には、大きなデータセットを処理するように設計されていない R で出力を使用したいと考えています。

4

1 に答える 1

7

SQL Server を使用しているため SQL でこれを実行する場合は、PIVOT 関数を使用してデータを行から列に変換できます。

select name,
  [What is your address?], 
  [How old are you?], 
  [Do you have a job?]
from yourtable
pivot
(
  max(answer)
  for question in ([What is your address?], [How old are you?], [Do you have a job?])
) piv;

SQL Fiddle with Demoを参照してください。

不明な値がある場合は、動的 SQL を使用して解決策を得ることができます。

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Question) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT name, ' + @cols + ' 
             from yourtable
            pivot 
            (
                max(answer)
                for Question in (' + @cols + ')
            ) p '

execute sp_executesql @query;

デモで SQL Fiddle を参照してください

于 2013-08-02T20:17:55.903 に答える