oracle行列互换几种类型实现浅析
一、行转列(组函数和decode实现)
如何将上图的原始表数据转换成下图的报表?
创建测试环境:
CREATE TABLE row_table(
item_id number(3), kind varchar2(10), value varchar2(10)
);
INSERT INTO row_table VALUES (100, 'kind1', 'value11');
INSERT INTO row_table VALUES (100, 'kind2', 'value21');
INSERT INTO row_table VALUES (100, 'kind3', 'value31');
INSERT INTO row_table VALUES (200, 'kind1', 'value12');
INSERT INTO row_table VALUES (200, 'kind2', 'value22');
INSERT INTO row_table VALUES (200, 'kind3', null);
INSERT INTO row_table VALUES (300, 'kind1', 'value13');
INSERT INTO row_table VALUES (300, 'kind2', NULL);
INSERT INTO row_table VALUES (300, 'kind3','value33');
commit;
select * from row_table
特点:每一个item_id都有3个kind,每个kind有一个value。
实现:将每一个item_id的所有kind值输出在一行上,这就是“行转列”
实现方式:
select item_id,
max(decode(kind, 'kind1', value, null)) as kind1,
max(decode(kind, 'kind2', value, null