首页 > 解决方案 > MYSQL - 在 select 和 group by 中将多列显示为不同的值

问题描述

当我运行这个查询时,

select deviceId,value from table group by deviceId;

deviceId    value
T01         50
T01         60  
T01         65
T01         32
T02         34
T02         30  
T02         22
T02         15
T03         70
T03         78  
T03         80
T03         89

但我需要如下输出,

T01 T02 T03
50  34  70
60  30  78
65  22  80
32  15  89

如何使用 mysql 查询来实现这一点?

做这种格式的原因,我想把这样的数据写入excel文件。

标签: mysql

解决方案


这可以在 MySQL 中完成,但几乎可以肯定在您的应用程序框架中更容易完成。无论如何,如果所有deviceId值在表中具有相同的行数(或者如果T01>= T02>=的值数T03),则此查询将为您提供您正在寻找的结果,尽管应该注意可以有对输出中数据的顺序没有真正的保证。该查询将人工行号分配给每个deviceId值,然后deviceId在该行号上连接每个值的集合:

SELECT t01, t02, t03
FROM (SELECT value AS t01, @rn1 := @rn1+1 AS rn
      FROM table1 t1
      JOIN (SELECT @rn1 := 0) rn1
      WHERE deviceId = 'T01'
      ORDER BY rn) t1
LEFT JOIN (SELECT value AS t02, @rn2 := @rn2+1 AS rn
           FROM table1 t2
           JOIN (SELECT @rn2 := 0) rn1
           WHERE deviceId = 'T02'
           ORDER BY rn) t2 ON t2.rn = t1.rn
LEFT JOIN (SELECT value AS t03, @rn3 := @rn3+1 AS rn
           FROM table1 t1
           JOIN (SELECT @rn3 := 0) rn1
           WHERE deviceId = 'T03'
           ORDER BY rn) t3 ON t3.rn = t1.rn

输出:

t01     t02     t03
50      34      70
60      30      78
65      22      80
32      15      89

如果T02值多于T01T03多于T02,则必须对FULL OUTER JOIN上述查询中的三个子查询执行 a ,这是 MySQL 不直接支持的。这个问题可以指出你将如何做到这一点。

SQLFiddle 演示


推荐阅读