日期:2014-05-17  浏览次数:20861 次

急救!!怎样将可变列转为行??
一张病人费用表,含有以下字段:住院号(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 ……

列转行

------解决方案--------------------
生成 select 语句的 pl/sql 块如下:

set serveroutput on
declare 
  cursor c1 is select distinct code from t1 order by code;
  v_sql varchar2(1024);
begin
  v_sql := 'select '
------解决方案--------------------
chr(10)
------解决方案--------------------
'no,'
------解决方案--------------------
chr(10);
  for c1_result in c1 loop
    v_sql := v_sql
------解决方案--------------------
'sum(case code when '''
------解决方案--------------------
c1_result.code
------解决方案--------------------
''' then cost else 0 end) c'
------解决方案--------------------
c1_result.code
------解决方案--------------------
','
------解决方案--------------------
chr(10);
  end loop;
  v_sql := substr(v_sql, 0, length(v_sql) - 2);