SQL将多行动态字段查询结果合并为单行列转行实现方法
要实现每个Record_ID对应唯一一行的效果,核心是对你当前的查询结果按Record_ID分组,用聚合函数提取各字段的非空值即可。你原查询中每个CASE语句仅在匹配对应Dynamic_Field_ID时返回有效值,其余均为NULL,使用MAX/MIN这类聚合函数会自动忽略NULL值,刚好能取出每个字段对应的值。
修改后的SQL语句如下:
SELECT tabDynValues.Record_ID, MAX(CASE Dynamic_Field_ID WHEN 755 THEN tabDynValues.Value_Char END) Filiale, MAX(CASE Dynamic_Field_ID WHEN 756 THEN tabDynValues.Value_Double END) AD, MAX(CASE Dynamic_Field_ID WHEN 757 THEN tabDynValues.Value_Double END) Vertrieb, MAX(CASE Dynamic_Field_ID WHEN 758 THEN tabDynValues.Value_Double END) Expansion FROM CI_AM_Dynamic_Field_Value tabDynValues WHERE tabDynValues.Activity_ID = 100612 AND tabDynValues.Dynamic_Field_ID IN (SELECT Dynamic_Field_ID FROM CI_AM_Dynamic_Field WHERE Dynamic_Field_Group_ID = 238) GROUP BY tabDynValues.Record_ID ORDER BY tabDynValues.Record_ID
改动说明
- 移除了SELECT列表中的
Dynamic_Field_ID字段,你预期输出中该列为空,且分组后同个Record_ID对应多个动态字段ID,无需保留该字段 - 为每个CASE判断语句外层套了MAX聚合函数,自动过滤NULL值,提取同个Record_ID下对应字段的有效值
- 新增
GROUP BY tabDynValues.Record_ID子句,按记录ID分组,确保每个Record_ID最终仅输出一行 - 移除了ORDER BY子句中的Dynamic_Field_ID排序规则,分组后无需再按动态字段ID排序
上述写法是SQL通用的行转列实现方案,兼容所有主流关系型数据库。如果你使用的数据库支持PIVOT语法(如SQL Server、Oracle、PostgreSQL 15及以上版本),也可以用PIVOT关键字实现同等效果,写法会更简洁。
内容的提问来源于stack exchange,提问作者Raphnika
相关产品推荐
相关产品推荐

