SQL技术问题:如何将不同field_id的列值合并到同一ticket_id行?
解决方案:行转列实现同一ticket_id多字段值同行展示
这是典型的行转列需求,不用修改原表结构的话,有两种简单好用的方法可以实现你的目标:
方法一:条件聚合(推荐,通用型强)
核心思路是按ticket_id分组,通过CASE WHEN判断field_id,提取对应value,再用聚合函数(比如MAX)把同一分组下的目标值筛选出来。
假设你的表名叫ticket_fields,对应的SQL语句如下:
SELECT ticket_id AS ticket, MAX(CASE WHEN field_id = 16 THEN value END) AS PO#, MAX(CASE WHEN field_id = 7 THEN value END) AS Est Hours FROM ticket_fields WHERE field_id IN (7, 16) -- 只筛选需要的field_id,提升性能 GROUP BY ticket_id ORDER BY ticket_id;
为什么用MAX?
因为每个ticket_id对应每个field_id只有一条记录,MAX会直接取出唯一的那个值;你也可以用SUM或者MIN,效果完全一样,只是MAX语义上更贴合“取唯一值”的场景。
方法二:自连接(适合少量字段的场景)
如果只需要转两三个字段,也可以用自连接的方式,把表分别关联两次,各自匹配对应的field_id:
SELECT t1.ticket_id AS ticket, t1.value AS PO#, t2.value AS Est Hours FROM ticket_fields t1 JOIN ticket_fields t2 ON t1.ticket_id = t2.ticket_id WHERE t1.field_id = 16 AND t2.field_id = 7 ORDER BY t1.ticket_id;
注意点
如果某个ticket_id只存在其中一个field_id的记录,自连接会把这条记录过滤掉;而条件聚合会保留它,对应字段显示为NULL,你可以根据业务需求选择。
这两种方法都不需要修改原表结构,执行后就能得到你想要的结果:
+--ticket--+--PO#--+--Est Hours--+ + 423 + PO123 + 17 + + 344 + PO101 + 24 + +--------------------------------+
内容的提问来源于stack exchange,提问作者dcary
相关产品推荐
相关产品推荐

