mysql - 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 中完成,但几乎可以肯定在您的应用程序框架中更容易完成。无论如何,如果所有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
上述查询中的三个子查询执行 a ,这是 MySQL 不直接支持的。这个问题可以指出你将如何做到这一点。
推荐阅读
- java - 我如何在 Java 文件中编写代码?
- python - Python 列表按标识符提取元素
- reactjs - 从 MUI 模态中删除边框
- flutter - 打开 SnackBar 内部函数发送到 AppBar
- powershell - 在 Xamarin 解决方案中使用 GithubActions 在 AndroidManifest.xml 中将 versionName 替换为我自己的
- python - flask appbuilder 如何将数据传递给操作 - 已解决
- encoding - 雪花:将字段编码转换为 UTF8
- javascript - 将 Javascript Date 对象转换为 Java LocalDateTime
- c++ - 在 SDL 或任何语言中绘制圆圈的内存友好方式?
- javascript - 在 3 个不同的谷歌折线图中可视化数据