2

次のようなテーブルがあります

PIN    QuestionNum     Response
1111   1               1
1111   2               3
2222   1               4
2222   2               3
3333   2               5

私のクエリから期待される出力は次のようになります。

PIN   Question1   Question2
1111  1           3
2222  4           3
3333  null        5

クエリの出力をこのように表示できるかどうかはわかりません。

これが可能かどうか誰かアドバイスしてください。

4

1 に答える 1

3

これは基本的にはありPIVOTますが、MySQL には機能がありませんPIVOT。したがって、集計関数とCASEステートメントを使用してこれを複製する必要があります。値の数がわかっている場合は、次のQuestionNumようなクエリをハードコーディングできます。

select pin,
  max(case when QuestionNum = 1 then response end) Question1,
  max(case when QuestionNum = 2 then response end) Question2
from yourtable
group by pin

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

の値の数が不明な場合はQuestionNum、準備済みステートメントを使用して、このクエリの動的バージョンを生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when QuestionNum = ''',
      QuestionNum,
      ''' then response end) AS Question',
      QuestionNum
    )
  ) INTO @sql
FROM yourtable;

SET @sql = CONCAT('SELECT pin, ', @sql, ' 
                  FROM yourtable 
                  GROUP BY pin');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

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

どちらも同じ結果になります。

|  PIN | QUESTION1 | QUESTION2 |
--------------------------------
| 1111 |         1 |         3 |
| 2222 |         4 |         3 |
| 3333 |    (null) |         5 |
于 2012-11-12T13:02:23.243 に答える