Oracle怎样将可变列转为行??
一张病人费用表FEE,含有以下字段:住院号(NO)、费用项目编号(CODE)、费用金额(COST)。其中每一个病人可能有若干种费用项目,并且费用项目是可重复的。详见下表:...
一张病人费用表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
……
原表样式:
处理结果: 展开
其中每一个病人可能有若干种费用项目,并且费用项目是可重复的。详见下表:
住院号
费用项目编号
费用金额
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
……
原表样式:
处理结果: 展开
3个回答
展开全部
方法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就行了。
declare
sqlstr 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;
展开全部
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;
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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-31
展开全部
SELECT NO,SUM(CODE) ,SUM(COST) FROM FEE group by NO
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询