4

StackOverflowの質問を調べてきましたが、この問題の質問は実際には見つかりませんでした。

基本的に次のように配置されたテーブルがあります。

Table.LineID
Table.QuestionGroup
Table.Question
Table.Answer

そして、テーブルを「ピボット」したいのですが、質問と回答には集約するものがありません。たとえば、これらはすべて単なるテキストフィールドであり、次のようになります。

Table.LineID = 00001
Table.QuestionGroup = Color
Table.Question = Outside Color
Table.Answer = Dark Green

Table.LineID = 00001
Table.QuestionGroup = Size
Table.Question = Height
Table.Answer = 180 3/4

線の関連IDを取得し、その拡散関数を質問にすることができるように、テーブルをピボットしようとしています。

LineID | 質問1| 質問2| 等...

| 回答1| 回答2| 等...

私はこのhttps://stackoverflow.com/a/7744347/839330を見てきましたが、これはいくつかのVBコードを参照しているようです(おそらく私は間違っていますか?)。誰かが私がこれにどのように取り組むべきかについての考えを持っていますか?

4

1 に答える 1

9

テーブルにテキストデータがあるからといって、そのテーブルで集計関数を使用できないという意味ではありません。

使用しているRDBMSを指定していませんが、このタイプのデータ変換は重要です。これにより、行データが列に変換されます。CASE一部のデータベースにはピボット関数がありますが、その関数がないデータベースを使用している場合は、次の式を使用して集計関数を使用する必要があります。

select lineid,
  max(case when question ='Height' then answer else '' end) Height,
  max(case when question ='Outside Color' then answer else '' end) [Outside Color]
from yourtable 
group by lineid

SQL FiddlewithDemoを参照してください

ピボット機能(SQL Server 2005 + / Oracle 11g +)を備えたデータベースがある場合、コードは次のようになります。

select *
from 
(
  select lineid,
    Question,
    Answer
  from yourtable
) src
pivot
(
  max(answer)
  for question in ([Height], [Outside Color])
) piv;

SQL FiddlewithDemoを参照してください

これで、SQL Server 2005+を使用していて、列に変換したい質問の数が不明な場合は、次のような動的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 lineid,' + @cols + ' from 
             (
                select lineid,
                  Question,
                  Answer
                from yourtable
            ) x
            pivot 
            (
                max(Answer)
                for Question in (' + @cols + ')
            ) p '

execute(@query)

デモ付きのSQLフィドルを参照してください

サンプルデータに基づくと、結果は次のようになります。

| LINEID |  HEIGHT | OUTSIDE COLOR |
------------------------------------
|      1 | 180 3/4 |    Dark Green |
于 2013-01-17T21:18:05.880 に答える