资源描述:
《行转列与列转行案例》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1.使用视图SQLcode?123456789101112131415161718192021222324252627createorreplaceprocedurerow_to_col(tabnameinvarchar2,group_colinvarchar2,column_colinvarchar2,value_colinvarchar2,Aggregate_funcinvarchar2default'max',colorderinvarchar2defaultnull,roworderinvarchar2defaultnull,when_value_nullinvarc
2、har2defaultnull,viewnameinvarchar2default'v_tmp')AuthidCurrent_Userassqlstrvarchar2(2000):='createorreplaceview'
3、
4、viewname
5、
6、'asselect'
7、
8、group_col
9、
10、'';c1sys_refcursor;v1varchar2(100);beginopenc1for'selectdistinct'
11、
12、column_col
13、
14、'from'
15、
16、tabname
17、
18、casewhencolorderisnotnullthen'orderby'
19、
20、colorder
21、end;loopfetchc1intov1;exitwhenc1%notfound;sqlstr:=sqlstr
22、
23、chr(10)
24、
25、','
26、
27、casewhenwhen_value_nullisnotnullthen'nvl('end
28、
29、Aggregate_func
30、
31、'(decode(to_char('
32、
33、column_col
34、
35、'),'''
36、
37、v1
38、
39、''','
40、
41、value_col
42、
43、'))'
44、
45、casewhenwhen_value_nullisnotnullthenchr(44)
46、
47、when_value_null
48、
49、chr(41)end
50、
51、'"'
52、
53、v1
54、
55、'"';e
56、ndloop;closec1;sqlstr:=sqlstr
57、
58、'from'
59、
60、tabname
61、
62、'groupby'
63、
64、group_col
65、
66、casewhenroworderisnotnullthen'orderby'
67、
68、roworderend;executeimmediatesqlstr;endrow_to_col;这里修改了传入参数名,使其更容易理解。继续使用了创建视图这个方法,当然也可以改成用游标传出。参数:tabname需要进行行转列操作的表名;group_col查询结果要按某列或某些列分组的字段名;column_col要从行转成列的字段;value_col需要聚合的值
69、字段;Aggregate_func选用的聚合函数,可选,默认为max;colorder行转列后列的排序,可选;roworder行转列后记录的排序,可选;when_value_null若value_col字段的值聚合后为空,则转换成该值,可选;viewname创建的视图名称,可选,默认为v_tmp。举例:SQLcode?1234567891011--测试数据createtablerowtocol_testasselect2009year,1month,'部门1'dept,50000expenditurefromdualunionallselect2009,2,'部门1',200
70、00fromdualunionallselect2009,2,'部门1',30000fromdualunionallselect2010,1,'部门1',35000fromdualunionallselect2009,2,'部门2',40000fromdualunionallselect2009,3,'部门2',25000fromdualunionallselect2010,2,'部门3',60000fromdualunionallselect2009,2,'部门3',15000fromdualunionallselect2009,2,'部门3',10000fromdual;
71、我现在想根据year和month分组,将部门转成列。SQLcode?123456789101112131415161718192021222324SQL>select*fromrowtocol_test;YEARMONTHDEPTEXPENDITURE------------------------------------20091部门15000020092部门12000020092部门13000020101部门13500020092部门24000020093部门22500020102部门3600002