Oracle SQL如何按相同ID提取不同行对应列值生成聚合结果
Oracle SQL 实现需求的具体写法
你需要的是按ID分组后,分别提取不同product_id对应的指定字段值,以下两种写法都可以直接运行得到目标结果:
写法1:CASE WHEN + 聚合(全版本兼容)
这种写法不需要依赖高版本Oracle特性,适配所有环境:
SELECT ID, MAX(CASE WHEN product_id = 10 THEN product_value10 END) AS Product_value10, MAX(CASE WHEN product_id = 20 THEN product_value20 END) AS Product_value20, MAX(CASE WHEN product_id = 30 THEN product_value30 END) AS Product_value30 FROM Product GROUP BY ID ORDER BY ID;
逻辑说明:用CASE语句只保留对应product_id行的目标字段值,其余行返回null,再通过MAX聚合过滤掉null值,最终每个ID得到一行汇总结果。
写法2:PIVOT行转列(Oracle 11g及以上版本支持)
如果你用的是11g及更高版本的Oracle,可以用行转列语法更直观实现:
SELECT * FROM ( SELECT ID, product_id, -- 先提取每行对应要保留的目标值 CASE product_id WHEN 10 THEN product_value10 WHEN 20 THEN product_value20 WHEN 30 THEN product_value30 END AS val FROM Product ) PIVOT ( MAX(val) FOR product_id IN ( 10 AS Product_value10, 20 AS Product_value20, 30 AS Product_value30 ) ) ORDER BY ID;
内容的提问来源于stack exchange,提问作者udhaya sakthi
相关产品推荐
相关产品推荐

