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

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