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
……
原表样式:

处理结果:
展开
 我来答
frogley
2013-08-31 · TA获得超过1854个赞
知道小有建树答主
回答量:1008
采纳率:50%
帮助的人:1078万
展开全部

方法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;
厍曼冬6o
2013-08-31 · TA获得超过1569个赞
知道小有建树答主
回答量:1336
采纳率:0%
帮助的人:1202万
展开全部
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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-31
展开全部
SELECT NO,SUM(CODE) ,SUM(COST) FROM FEE group by NO
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式