1

mySQLに問題があります。私はこのようなテーブルを持っています:

Time                    Sensor    Value   
2012-10-16 14:42:32 VI0    0      
2012-10-16 14:42:32 VI1    0      
2012-10-16 14:42:32 VI2    0      
2012-10-16 14:42:32 VI3    0      
2012-10-16 14:42:33 VI0    1      
2012-10-16 14:42:33 VI1    1      
2012-10-16 14:42:33 VI2    1      
2012-10-16 14:42:33 VI3    1    

sensor私はすべての名前センサーと他の情報を含むテーブル""を持っています。そのテーブルを次のようなテーブルに再配置することは可能ですか?

Time                    VI0        VI1      VI2    VI3

2012-10-16 14:42:32 0      0         0      0

2012-10-16 14:42:32 1      1         1      1

ピボットテーブルを探していますが、それが正しい方法かどうかわかりません。

PS多分私は解決策を見つけました:

SELECT time、GROUP_CONCAT(value)as Sensor FROM measure2 GROUP BY time;

時間GROUP_CONCAT(値)

2012-10-16 14:42:32 0,0,0,0

GROUP_CONCATの代わりに、センサーの名前をコンマで書くことはできますか?

4

1 に答える 1

3

pivotデータに対してプリペアドステートメントを動的に使用する必要があるように思われます。CASEこれは、次のステートメントで集計関数を使用します。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when Sensor = ''',
      Sensor,
      ''' then value end) AS ',
      Sensor
    )
  ) INTO @sql
FROM  measure2;

SET @sql = CONCAT('SELECT time, ', @sql, ' 
                  FROM measure2 
                  GROUP BY time');

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

SQL FiddlewithDemoを参照してください

既知の値がある場合は、値をハードコーディングできます。

select time,
  max(case when sensor = 'VI0' then value end) as VI0,
  max(case when sensor = 'VI1' then value end) as VI1,
  max(case when sensor = 'VI2' then value end) as VI2,
  max(case when sensor = 'VI3' then value end) as VI3
from measure2
group by time

SQL FiddlewithDemoを参照してください

于 2012-10-30T12:12:00.200 に答える