这是从数据库差出来的字段
区域    指标1    指标2    指标3    年度    月度一环    100      200      300      2011     8
一环    100      200      300      2010     8
二环    100      200      300      2011     8
二环    100      200      300      2010     8           
三环    100      200      300      2011     8 
三环    100      200      300      2010     8     要把以上表格转化成下面这个样子区域    指标名称    2011-8(当前月)   2010-8(去年同期)一环    指标1          100               100      
一环    指标2          200               200     
一环    指标3          300               300
二环    指标1          100               100      
二环    指标2          200               200
二环    指标3          300               300 
三环    指标1          100               100      
三环    指标2          200               200  
三环    指标3          300               300 首先是部分的行列转换,然后把库中的年度、月度接起来当列名使用
SQL 不是很会用,尝试了一下,没出来,请教各位大神
用oracle 怎样实现?谢谢了

解决方案 »

  1.   

    假设都是varchar
    区域 area
    指标1 p1
    指标2 p2
    指标3 p3
    年度  year
    月度  mon
    指标名称 pname
    表 tab1with temptab as(
    select area,p1 p,'指标1' as pname,year,mon from tab1
    union
    select area,p2 p,'指标2' as pname,year,mon from tab1
    union
    select area,p3 p,'指标3' as pname,year,mon from tab1
    )
    select area,pname,t1.p,t2.p 
    from temptab t1,temptab t2 
    where t1.area=t2.area 
    and t1.pname = t2.pname 
    and t1.mon = t2.mon 
    and t1.year='2011' and t2.year='2010' ;
    本地无环境,没测过。如有问题,请指正。
      

  2.   


    SQL> WITH t AS (
      2      SELECT '一环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
      3      SELECT '一环' area,101 p1,201 p2,301 p3,2010 tyear,8 mon FROM dual UNION ALL
      4      SELECT '二环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
      5      SELECT '二环' area,102 p1,202 p2,302 p3,2010 tyear,8 mon FROM dual UNION ALL
      6      SELECT '三环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
      7      SELECT '三环' area,103 p1,203 p2,303 p3,2010 tyear,8 mon FROM dual
      8  )
      9  SELECT m.area,
     10         m.pname,
     11         MAX(decode(m.tyear,2011,m.p,NULL)) 当前月,
     12         MAX(decode(m.tyear,2010,m.p,NULL)) 去年同期
     13    FROM (
     14      SELECT t.area,'指标1' pname,t.p1 p,t.tyear,t.mon FROM t UNION ALL
     15      SELECT t.area,'指标2' pname,t.p2 p,t.tyear,t.mon FROM t UNION ALL
     16      SELECT t.area,'指标3' pname,t.p3 p,t.tyear,t.mon FROM t
     17  ) m
     18  GROUP BY m.area,m.pname
     19  ORDER BY m.area,m.pname
     20  ;AREA   PNAME       当前月   去年同期
    ------ ------- ---------- ----------
    一环   指标1          100        101
    一环   指标2          200        201
    一环   指标3          300        301
    三环   指标1          100        103
    三环   指标2          200        203
    三环   指标3          300        303
    二环   指标1          100        102
    二环   指标2          200        202
    二环   指标3          300        302排序有点问题,因为是按照area的汉字排序,最好是按照区域的ID排序
      

  3.   

    oracle的聚合函数,有专列功能吧。记不清了,自己查查。