2012-10-30 82 views
1

我有一个mySQL的问题。 我有这样一个表:在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.也许我找到了解决办法:

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

时间GROUP_CONCAT(值)

二○一二年十月一十六日14时42分32秒0,0,0,0

相反GROUP_CONCAT可以谨逗号传感器的名字?

+0

查看这些链接:[动态数据透视表](http://buysql.com/mysql/14-how-to-automate-pivot-tables.html),[自动化数据透视表查询](http: //www.artfulsoftware.com/infotree/queries.php#523)。 – Devart

+0

VI0等总是零或一个或不同的值? –

+0

@MichaelBerkowski有不同的价值,是衡量的工厂 – vincenzoAlessandroSantamaria

回答

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

+0

非常感谢你! – vincenzoAlessandroSantamaria