当我运行此查询时,
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中完成,但几乎可以肯定的是,在您的应用程序框架中更容易完成。无论如何,如果所有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
的值多于T01
,或T03
大于T02
,则必须对上述查询中的三个子查询进行FULL OUTER JOIN
,MySQL不直接支持。这个问题可以指出你如何做到这一点。
SQLFiddle 演示