选择具有相同列的所有行以分隔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_CONCATCASE 表达式来定位每个传感器数据。

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中的列的主要内容,如果未能解决你的问题,请参考以下文章

逗号分隔的连接和MySQL中的语法连接有啥区别? [复制]

MySQL选择具有不同值的所有行相同的列

合并具有多个分隔符的列

在 MySQL 中导出包含换行符的列的表

点击屋;列出具有多个 IP 地址的列的 IP 地址的问题

通过phpmyadmin将csv文件导入mysql