【在线求助】纵表转横表的相关问题Oracle下sql切磋
pl/SQL中如何解决纵表转横表,显示报表,大家有什么好的建议或意见吗?  
帮忙看看这个sql应该怎么写?
现在有个表A ,有两个字段a1(个人编号),a2(待遇类别)
数据如下:
a1         a2
12345      101
12345      102
12345      103
12345      104
123        101
123        104
我现在想通过查询得到以下的输出结果:
a1(个人编号)   待遇类别1 待遇类别2  待遇类别3  待遇类别4.。
12345            101         102       103        104
123              101                              104请大家帮忙看看怎么能通过sql查询出来,谢谢先

解决方案 »

  1.   

    ...行列转换,老问题了,一搜一大堆
    select max(decode(a2,101,a2))待遇类别1,
      max(decode(a2,102,a2))待遇类别2,
      max(decode(a2,103,a2))待遇类别3,
      max(decode(a2,104,a2))待遇类别4
    group by a1
      

  2.   

    漏了from ..
    自己加上去
      

  3.   

      请问一下,假如表中的“a2(待遇类别)”有二百多个待遇项目,
    如:待遇类别1 待遇类别2  待遇类别3  待遇类别4 ……  待遇类别n;;难道也要手工逐个写:   max(decode(a2,101,a2))待遇类别1, 
                        max(decode(a2,102,a2))待遇类别2, 
                        max(decode(a2,103,a2))待遇类别3, 
                        max(decode(a2,104,a2))待遇类别4 
                        …………
                           max(decode(a2,104,a2))待遇类别n写n条,岂不很麻烦,而且sql的执行效率估计也不会很高,不知道有没有更好的sql写法?请老师们指教,,,                     
      

  4.   

    select 
    A1,
    decode(sum(T_101),0,'','101') as C1,
    decode(sum(T_102),0,'','102') as C2,
    decode(sum(T_103),0,'','103') as C3,
    decode(sum(T_104),0,'','104') as C4 
    from
    (
    select A1,
    decode(A2, '101', 1,0) as T_101,
    decode(A2, '102',1,0) as T_102,
    decode(A2, '103', 1,0) as  T_103,
    decode(A2, '104', 1,0) as T_104
    from A)
    group by A1;还有没有更好的写法,或者有更复杂的情况,大家拿出来分享一下现在的关键问题就是表中的待遇类别中的项目太多,没有什么规律,都是依据文件应付待遇项目,总共有二百到三百个待遇项目;
      

  5.   

    麻烦在列名上
    如果可以把这些待遇归到一列的话,就解决了
    select a1,wm_concat(a2) 待遇类别 from  a
    如果觉得不够直观
    select a1,wm_concat(a2) from (
    select t.a1,nvl(a.a2,'000')a2 from
    (select * from (select distinct a2 from a)t1,
      (select distinct a1 from a)t2 order by a1,a2)t,a
    where t.a1=a.a1(+) and t.a2=a.a2(+)  
    order by t.a1,t.a2)
    group by a1