Oracle按另一列分组后在多列中查询的SQL实现咨询
解决方案:Oracle按Item分组合并多列属性值
从你的表结构来看,你需要将同一item下不同type(字符串S、数字N、日期D)对应的属性值合并到单行中,下面是两种常用的Oracle SQL实现方案:
方案1:使用PIVOT函数(Oracle 11g+)
PIVOT是Oracle 11g引入的行转列函数,语法简洁直观,适合处理这种固定类型的行转列需求:
SELECT item, s_string_value AS string_value, n_number_value AS number_value, d_date_value AS date_value FROM your_table_name PIVOT ( MAX(string_value) AS string_value, MAX(number_value) AS number_value, MAX(date_value) AS date_value FOR type IN ('S' AS s, 'N' AS n, 'D' AS d) ) ORDER BY item;
方案2:条件聚合(兼容所有Oracle版本)
如果你的Oracle版本低于11g,或者需要更好的兼容性,条件聚合是更稳妥的选择,通过CASE WHEN配合聚合函数实现行转列:
SELECT item, MAX(CASE WHEN type = 'S' THEN string_value END) AS string_value, MAX(CASE WHEN type = 'N' THEN number_value END) AS number_value, MAX(CASE WHEN type = 'D' THEN date_value END) AS date_value FROM your_table_name GROUP BY item ORDER BY item;
补充说明
- 两种方案都会输出类似这样的结果:
item string_value number_value date_value 11 abcd 134.56 2017/01/01 12 null 134.56 null 13 efgh 99 2000/05/21 - 因为每个
item对应每个type最多只有一条记录,所以使用MAX()或MIN()聚合函数都可以,它们会自动忽略NULL值,保留有效数据。 - 记得把
your_table_name替换成你实际的表名。
内容的提问来源于stack exchange,提问作者user2219927
相关产品推荐
相关产品推荐

