Oracle怎样将可变列转为行??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle怎样将可变列转为行??相关的知识,希望对你有一定的参考价值。
一张病人费用表FEE,含有以下字段:住院号(NO)、费用项目编号(CODE)、费用金额(COST)。
其中每一个病人可能有若干种费用项目,并且费用项目是可重复的。详见下表:
住院号
费用项目编号
费用金额
ZY001
010
30
ZY001
055
60
ZY001
055
40
ZY001
068
50
ZY002
011
30.2
ZY002
047
68
ZY002
055
80
ZY002
019
55.5
ZY002
019
63
现在要求统计出每个病人的每一项费用的金额汇总
以如下方式输出:
住院号
010
055
068
……
ZY001
30
100
50
……
ZY002
0
80
0
……
原表样式:
处理结果:
方法1:decode
--用decode实现行转列--适用范围:8i,9i,10g及以后版本
SELECT NO,
SUM(decode(CODE, '010', COST)) "010",
SUM(decode(CODE, '011', COST)) "011",
SUM(decode(CODE, '019', COST)) "019",
SUM(decode(CODE, '047', COST)) "047",
SUM(decode(CODE, '055', COST)) "055",
SUM(decode(CODE, '068', COST)) "068"
FROM FEE
GROUP BY NO
ORDER BY NO asc
方法2:pivot
--用Pivot实现行转列--适用范围:11g及以后
SELECT *
FROM FEE
PIVOT (
SUM(NVL(COST,0))
FOR CODE
IN ('010','011','019','047','055','068')
) ORDER BY NO asc;
结果如下:
追问非常感谢您的回复
您的回复让我获益匪浅
只是这里的CODE列值是可变的
采取硬编码方式灵活性不够
请问您还有什么更好的方法吗?
拼接动态SQL就行了。
declaresqlstr varchar2(8000) := '';
begin
select WM_CONCAT(''''||CODE||'''') into sqlstr
from (
select distinct CODE from FEE order by CODE
) t;
sqlstr:='SELECT *
FROM FEE
PIVOT (
SUM(NVL(COST,0))
FOR CODE
IN ('||sqlstr||')
) ORDER BY NO asc';
execute immediate sqlstr;
sqlstr := 'CREATE OR REPLACE VIEW tmp_result AS '|| sqlstr;
execute immediate sqlstr;
end;
这里把查询结果放到了视图tmp_result里。查看这个视图就可以了。
select * from tmp_result; 参考技术A select no,sum(case when code='010' then cost else 0 end),sum(case when code='055' then cost else 0 end),
sum(case when code='068' then cost else 0 end),......
from fee
group by no; 参考技术B SELECT NO,SUM(CODE) ,SUM(COST) FROM FEE group by NO
以上是关于Oracle怎样将可变列转为行??的主要内容,如果未能解决你的问题,请参考以下文章