-1

次のようなテーブル結果をピボットしようとしています.....

     -----------------------------------------------
    | personsID    |   personsWeight |  dateWeighed |
     -----------------------------------------------
    |          1   |      160        |   04/15/2011 |
     -----------------------------------------------
    |          1   |      161        |   04/18/2011 |
     -----------------------------------------------
    |          1   |      162        |   06/30/2011 |
     -----------------------------------------------
    |          1   |      163        |   07/11/2011 |
     -----------------------------------------------
    |          1   |      164        |   04/01/2012 |
     -----------------------------------------------

のようにしたい

     --------------------------------------------------------------------------------
    |  personsID   | 04/15/2011  | 04/18/2011 | 06/30/2011 | 07/11/2011 | 04/01/2012 |
     --------------------------------------------------------------------------------
    |        1     |     160     |   161      |     162    |     163    |    164     |
     --------------------------------------------------------------------------------
4

1 に答える 1

1

MySQL には PIVOT 関数がないため、集計関数をCASE式とともに使用して、データの行を列に変換する必要があります。

セット数または既知の数の値がある場合は、クエリをハードコーディングできます。

select personsId,
  sum(case when dateWeighed='2011-04-15' then personsWeight else 0 end) `04/15/2011`,
  sum(case when dateWeighed='2011-04-18' then personsWeight else 0 end) `04/18/2011`,
  sum(case when dateWeighed='2011-06-30' then personsWeight else 0 end) `06/30/2011`
from yt
group by personsId;

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

datesただし、列に変換したい数が不明な場合は、準備済みステートメントを使用して動的 SQL を生成する必要があります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(CASE WHEN dateWeighed = ''',
      dateWeighed,
      ''' THEN personsWeight else 0 END) AS `',
      date_format(dateWeighed, '%m/%d/%Y'), '`'
    )
  ) INTO @sql
FROM yt;

SET @sql 
  = CONCAT('SELECT personsId, ', @sql, ' 
            from yt
            group by personsId');

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

SQL Fiddle with Demoを参照してください。両方とも結果が得られます。

| PERSONSID | 04/15/2011 | 04/18/2011 | 06/30/2011 | 07/11/2011 | 04/01/2012 |
------------------------------------------------------------------------------
|         1 |        160 |        161 |        162 |        163 |        164 |
于 2013-04-20T20:32:14.783 に答える