是否可通过自连接将ROW_ID关联的多行数据合并为单行输出?
当然可以!这种将同一关联组的多行记录“转置”为单行的需求,用条件聚合就能完美解决,再也不用跑4个独立查询啦。
解决方案1:条件聚合(通用所有数据库)
这是最普适的写法,几乎所有关系型数据库都支持。假设你的表名为special_table,存储实际业务值的字段为data_value(如果你的字段名不同,替换成实际名称即可),单条查询代码如下:
SELECT ROW_ID, MAX(CASE WHEN column_id = 1 THEN data_value ELSE NULL END) AS column_1, MAX(CASE WHEN column_id = 2 THEN data_value ELSE NULL END) AS column_2, MAX(CASE WHEN column_id = 3 THEN data_value ELSE NULL END) AS column_3, MAX(CASE WHEN column_id = 4 THEN data_value ELSE NULL END) AS column_4 FROM special_table GROUP BY ROW_ID;
代码逻辑说明:
GROUP BY ROW_ID:把所有属于同一原始数据行的4条记录归为一组CASE WHEN:针对每个column_id,只提取对应组中该标识的记录值,其他情况返回NULLMAX()(或MIN()/SUM(),这里用MAX最稳妥):因为每组中每个column_id只有一条有效数据,聚合函数会自动忽略NULL,留下唯一的有效值
解决方案2:PIVOT语法(部分数据库支持)
如果你的数据库支持PIVOT专用语法(比如SQL Server、Oracle、PostgreSQL 11+),可以用更简洁的写法。以SQL Server为例:
SELECT ROW_ID, [1] AS column_1, [2] AS column_2, [3] AS column_3, [4] AS column_4 FROM special_table PIVOT ( MAX(data_value) FOR column_id IN ([1], [2], [3], [4]) ) AS pivot_table;
代码逻辑说明:
PIVOT是专门用于行转列的语法,你只需要指定:
- 聚合函数(这里用
MAX处理唯一值) - 要转置为列的字段(
column_id) - 转置后对应的目标列值(
[1],[2],[3],[4])
不管用哪种方法,查询结果直接导出到Excel就是每行对应一条原始数据,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Matt A
相关产品推荐
相关产品推荐

