在mySQL中创建动态表

时间:2012-10-30 11:11:53

标签: mysql pivot

我的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

我正在寻找数据透视表,但我不知道这是否正确。

P.S。也许我找到了解决方案:

选择时间,GROUP_CONCAT(值)作为Sensor FROM measure2 GROUP BY时间;

时间GROUP_CONCAT(值)

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

我可以用逗号写下传感器名称而不是GROUP_CONCAT吗?

1 个答案:

答案 0 :(得分: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 Fiddle with Demo

如果您有已知值,则可以对值进行硬编码:

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 Fiddle with Demo