【发布时间】:2020-09-24 10:59:04
【问题描述】:
【问题讨论】:
-
嗯……你可以试试。 Chris Saxon 有一篇关于枢轴的优秀文章:blogs.oracle.com/sql/…。看看它,看看它是否符合您的要求。
标签: sql oracle oracle11g pivot pivot-table
【问题讨论】:
标签: sql oracle oracle11g pivot pivot-table
我会推荐条件聚合。它是一种独立于数据库的语法,比 Oracle 特有的pivot 语法更灵活:
select
piece_id,
max(case when attrb_code = 'A' then attrb_a_value end) a,
max(case when attrb_code = 'B' then attrb_a_value end) b,
max(case when attrb_code = 'C' then attrb_a_value end) c,
max(case when attrb_code = 'D' then attrb_b_value end) d
from mytable
group by piece_id
【讨论】:
只需在PIVOT 中使用COALESCE(或NVL):
SELECT *
FROM table_name
PIVOT (
MAX( COALESCE( attrb_a_value, attrb_b_value ) )
FOR attrb_code IN (
'A' AS A,
'B' AS B,
'C' AS C,
'D' AS D
)
)
因此,对于您的示例数据:
CREATE TABLE table_name ( piece_id, attrb_code, attrb_a_value, attrb_b_value ) AS
SELECT 22333, 'A', 8, NULL FROM DUAL UNION ALL
SELECT 22333, 'B', 9, NULL FROM DUAL UNION ALL
SELECT 22333, 'C', 4, NULL FROM DUAL UNION ALL
SELECT 22333, 'D', NULL, 5 FROM DUAL UNION ALL
SELECT 22332, 'A', 2, NULL FROM DUAL UNION ALL
SELECT 22332, 'B', 3, NULL FROM DUAL UNION ALL
SELECT 22332, 'C', 7, NULL FROM DUAL UNION ALL
SELECT 22332, 'D', NULL, 5 FROM DUAL
这个输出:
PIECE_ID |一个 |乙| C | D --------: | -: | -: | -: | -: 22333 | 8 | 9 | 4 | 5 22332 | 2 | 3 | 7 | 5
db小提琴here
【讨论】: