1.数据准备
数据表sc4
create table cs4 (id number,
years number,
months number,
amount number);
insert into cs4 values(1,1991,1,1.1);
insert into cs4 values(2,1991,2,1.2);
insert into cs4 values(3,1991,3,1.3);
insert into cs4 values(4,1991,4,1.4);
insert into cs4 values(5,1992,1,2.1);
insert into cs4 values(6,1992,2,2.2);
insert into cs4 values(7,1992,3,2.3);
insert into cs4 values(8,1992,4,2.4);
查询结果

实际只需要使用第二列、第三列、第四列进行列转行操作,需要使用子查询实现;

2.方法1,使用聚合函数SUM+‘case ... when ...then’实现
select years,
SUM(CASE WHEN MONTHS = '1' THEN AMOUNT ELSE 0 END ) M1,
SUM(CASE WHEN MONTHS = '2' THEN AMOUNT ELSE 0 END) M2,
SUM(CASE WHEN MONTHS = '3' THEN AMOUNT ELSE 0 END ) M3,
SUM(CASE WHEN MONTHS = '4' THEN AMOUNT ELSE 0 END ) M4
FROM CS4 GROUP BY YEARS;

3.方法2,使用聚合函数SUM+'decode'实现
select years,
sum(decode(months,1,amount,0)) m1,
sum(decode(months,2,amount,0)) m2,
sum(decode(months,3,amount,0)) m3,
sum(decode(months,4,amount,0)) m4 from (select years,months,amount from cs4)
group by years;

4.使用函数pivot实现
select years,m1,m2,m3,m4
from (select years,months,amount from cs4)
pivot (sum(amount) for months in
('1' m1,
'2' m2,
'3' m3,
'4' m4));

5.函数简介
5.1.case...when...then...
case...when...then...是常用的条件判断
5.2.decode
decode,是条件判断
decode(<列名>,<条件1>,<结果1>,<条件2>,<结果2>...<默认值>)
当某一列参数值与条件对比,
若条件1成立返回结果1;
若不成立,则与条件2比较成立的话返回结果2;
若所有条件都不成立,则返回默认值;
若所有条件都不成立,也没有设置默认值,则返回null
5.3.pivot
oracle内置的行转列函数。
832

被折叠的 条评论
为什么被折叠?



