oracle横着数据竖起来显示 Case When语句
今天去面试,碰到一个题目。大致如下:
year month money(money自己瞎写的,忘记了题目中的单词了,当然不影响这个题目)
1991 1 1.1
1991 2 1.2
1991 2 1.3
1991 2 1.4
1992 2 2.1
1992 2 2.2
1992 2 2.3
1992 2 2.4
要求把 数据 横着显示,写一段sql实现:
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
因为本人才疏学浅,没写出来,回来查了下。原来是case when 语句。
故写下来,分享下(表名字就随便取一个了)。
create table bill(
b_year varchar2(4),
b_month varchar2(2),
money varchar2(10) -- 这里为了写起来方便,就写varchar2了
);
insert into billvalues('1991','1','1.1');
insert into billvalues('1991','2','1.2');
insert into billvalues('1991','3','1.3');
insert into billvalues('1991','4','1.4');
insert into billvalues('1992','1','2.1');
insert into billvalues('1992','2','2.2');
insert into billvalues('1992','3','2.3');
insert into billvalues('1992','4','2.4');
下面是一种实现方式:
select b_year as year,
max(case b_month when '1' money, else '0' end) m1,
max(case b_month when '2' money, else '0' end) m2,
max(case b_month when '3' money, else '0' end) m3,
max(case b_month when '4' money, else '0' end) m4
from bill group by b_year;
结果:
case?when?oracle
case?when
oracle
------解决方案--------------------是不是数据错了? 一年1、2、3、4月份 复制了没改的
如果月份是确定的 用decode函数也可以
如果不确定 那要用动态sql了 比较基本的列转行
------解决方案--------------------学习了,很不错
------解决方案-------------------- 比较不错 的,但是 我觉得 么必要 用 那个max 函数吧 ,
select b_year as year,
case b_month
when '1' then
m1
when '2' then
m2
when '3