合并查询结果记录:将分散存储的自定义字段数据合并为单条记录
合并自定义字段为单条记录的解决方案
嘿,我懂你想要的效果了——把分散在两张表里的自定义字段数据,合并成一条包含所有字段信息的记录对吧?这是个很常见的行转列需求,我给你两种实用的解决方案,适配不同的数据库场景:
解决方案1:通用SQL写法(适配大多数数据库)
这种方法用CASE WHEN配合聚合函数实现,几乎所有数据库都支持:
SELECT MAX(CASE WHEN cfd.CustomFieldName = 'Business Owner' THEN cfd_data.FieldData END) AS `Business Owner`, MAX(CASE WHEN cfd.CustomFieldName = 'Client' THEN cfd_data.FieldData END) AS `Client`, MAX(CASE WHEN cfd.CustomFieldName = 'Cost Center' THEN cfd_data.FieldData END) AS `Cost Center` FROM CustomFieldDefinitions cfd INNER JOIN CustomFieldData cfd_data ON cfd.CustomFieldID = cfd_data.CustomFieldID;
说明:
CASE WHEN会匹配每个自定义字段的名称,命中时取出对应的FieldData值,未命中则返回NULL- 用
MAX()(或者MIN(),因为每个CustomFieldID对应唯一一条数据)聚合,把多行结果合并成单行 - 如果你的
CustomFieldData里同一个CustomFieldID有多条历史记录,可以先通过子查询筛选出最新的(比如基于Updated字段取最大日期的数据),再进行行转列。
解决方案2:用PIVOT语法(适合SQL Server/Oracle等支持的数据库)
如果你的数据库支持PIVOT关键字,可以用更简洁的专门语法实现:
SELECT [Business Owner], [Client], [Cost Center] FROM ( -- 先取出需要的字段:自定义字段名和对应的值 SELECT cfd.CustomFieldName, cfd_data.FieldData FROM CustomFieldDefinitions cfd INNER JOIN CustomFieldData cfd_data ON cfd.CustomFieldID = cfd_data.CustomFieldID ) AS SourceTable PIVOT ( -- 聚合函数,这里用MAX因为每个字段只有一条数据 MAX(FieldData) -- 指定要转成列的字段名称 FOR CustomFieldName IN ([Business Owner], [Client], [Cost Center]) ) AS PivotTable;
说明:
- 子查询
SourceTable先整理出“字段名-字段值”的基础数据 PIVOT关键字负责把行里的CustomFieldName值转成列名,并用聚合函数提取对应的FieldData
如果你的自定义字段是动态变化的(不确定具体有哪些),那可能需要用动态SQL来自动生成列名列表,不过如果是固定的几个字段,上面的方案就完全够用啦。
内容的提问来源于stack exchange,提问作者Scott Ferguson
相关产品推荐
相关产品推荐

