データベース検索結果の縦横変換

データベースからの検索結果が縦方向に出力されてみにくい場合、こんな方法で横にも出来ます。

こんな感じで保管されているデータで・・・

user   |month  |result
-------+------+-------
user1  |    1  |  100
user1  |    2  |  200
(省略)
user1  |   10  |  150
user1  |   11  |  240
user1  |   12  |  270
user2  |    1  |  150
user2  |    3  |  170
user2  |    4  |  120
(省略)
user2  |    9  |  200
user2  |   10  |  300
user3  |    1  |  200
user3  |    2  |  300

この様にクエリを書いてSELECTすると・・・

SELECT user
    ,MAX(CASE WHEN month=1 THEN result END) AS '1月'
    ,MAX(CASE WHEN month=2 THEN result END) AS '2月'
    ,MAX(CASE WHEN month=3 THEN result END) AS '3月'
    ,MAX(CASE WHEN month=4 THEN result END) AS '4月'
    ,MAX(CASE WHEN month=5 THEN result END) AS '5月'
    ,MAX(CASE WHEN month=6 THEN result END) AS '6月'
    ,MAX(CASE WHEN month=7 THEN result END) AS '7月'
    ,MAX(CASE WHEN month=8 THEN result END) AS '8月'
    ,MAX(CASE WHEN month=9 THEN result END) AS '9月'
    ,MAX(CASE WHEN month=10 THEN result END) AS '10月'
    ,MAX(CASE WHEN month=11 THEN result END) AS '11月'
    ,MAX(CASE WHEN month=12 THEN result END) AS '12月'
  FROM table
GROUP BY user

こうなります。

user   |  1月  |  2月  |  3月  |  4月  |  5月  |  6月  ・・・
-------+-------+-------+-------+-------+-------+-------
user1  |  100  |  200  |  130  |  110  |  300  |  130  ・・・
user2  |  150  |  NULL |  170  |  120  |  210  |  130  ・・・
user3  |  200  |  300  |  NULL |  140  |  160  |  170  ・・・

 

コメントを残す