选择具有相同列的所有行以分隔mysql中的列
Posted
技术标签:
【中文标题】选择具有相同列的所有行以分隔mysql中的列【英文标题】:select all rows with same column to separate columns in mysql 【发布时间】:2018-08-16 14:06:18 【问题描述】:我有一张这样的桌子:
fkey | sensor | depth | value
-----+--------+-------+-------
1 | 1 | 1 | 34
1 | 1 | 2 | 27
1 | 2 | 1 | 22
1 | 2 | 2 | 34
1 | 2 | 3 | 56
2 | 1 | 1 | 12
2 | 1 | 2 | 24
2 | 2 | 1 | 56
3 | 1 | 1 | 43
3 | 1 | 2 | 89
3 | 1 | 3 | 97
如何将选择查询写入每个传感器的GROUP_CONCAT
值和ORDER BY
深度以显示这一点?
fkey | sensor1_values | sensor2_values
-----+-----------------+------------------
1 | 34,27 | 22,34,56
2 | 12,24 | 56
3 | 43,89,97 | NULL
【问题讨论】:
【参考方案1】:尝试使用GROUP_CONCAT
和CASE
表达式来定位每个传感器数据。
SELECT
fkey,
GROUP_CONCAT(CASE WHEN sensor=1 THEN value END ORDER BY depth) AS sensor1_values,
GROUP_CONCAT(CASE WHEN sensor=2 THEN value END ORDER BY depth) AS sensor2_values
FROM yourTable
GROUP BY fkey;
【讨论】:
非常感谢,它可以工作,但我怎样才能从中自动生成列名? @MojtabaArvin 为此,您需要动态 SQL,以生成列名或处理任意数量的传感器。【参考方案2】:试试这个查询,替换表名和列名
fkey 是 A 列 |传感器是 B 列 |深度是 C 列 |值为 D 列
select A, STUFF((SELECT ', ' + D FROM tableA b
WHERE b.A = a.A AND b.B = 1
FOR XML PATH('')), 1, 2, '') sensor1_values
, STUFF((SELECT ', ' + D FROM tableA b
WHERE b.A = a.A AND b.B = 2
FOR XML PATH('')), 1, 2, '') sensor2_values
from tableA a
group by A
【讨论】:
这个问题被标记为 mysql,而不是 SQL Server。以上是关于选择具有相同列的所有行以分隔mysql中的列的主要内容,如果未能解决你的问题,请参考以下文章