我有张a表 数据假如:
     data_id   area_id   changp1  changp2  changp3
     200809    001       320       222       333
     200809    002       328       211       111
     200910    001       430       102       321
     200910    002       453       890       432
 我现在需要貌似把他显示成:200910的数据
    
    changp   data_id   area_id
    430      001       200910
    453      002       200910
    102      001       200910
    890      002       200910
    321      001       200910
    432      002       200910   不用union all   请各位达人帮我下 如果还有表达不明的请指出马上更正
    小弟大恩不言谢 只有小小分子送上。

解决方案 »

  1.   

    貌似可以用自身关联解决。你可以试试看。自身关联,外加decode语法。应该是可以的。
      

  2.   

     谢谢shiqiang_03 的回答, 能不能明确点
      

  3.   

    以前的一个小实例,希望对你有所帮助:
    oracle 10g wmsys.wm_concat行列转换函数的使用 Oracle Database 10g Enterprise Edi
    With the Partitioning, OLAP and DaSQL> select *from test;ID NAME CONTENT
    ---------- ---------- ----------
    1 n1 c1
    2 n2 c1
    2 n2 c2
    3 n3 c1
    3 n3 c2
    3 n3 c3
    4 n4 c1
    4 n4 c2
    4 n4 c3已选择9行。SQL> col WMSYS.WM_CONCAT(CONTENT) for a30
    SQL> select id,name,wmsys.wm_concat(content) from test group by id,name;ID NAME WMSYS.WM_CONCAT(CONTENT)
    ---------- ---------- ------------------------------
    1 n1 c1
    2 n2 c1,c2
    3 n3 c1,c2,c3
    4 n4 c1,c3,c2
      

  4.   

    有难度,问一下,用union all有什么不好吗
      

  5.   

    还有一种行转列的方式,就是相同组中的行值变为单个列值,但转置的行值不变为列名:ID CN_1 CV_1 CN_2 CV_2 CN_3 CV_3
    1 c1 v11 c2 v21 c3 v31
    2 c1 v12 c2 v22 c3 
    3 c1 v13 c2 c3 v33
    4 c1 c2 v24 c3 v34
    5 c1 v15 c2 c3 
    6 c1 c2 c3 v35
    7 c1 c2 c3这种情况可以用分析函数实现:SELECT id,
       MAX(decode(rn, 1, cn, NULL)) cn_1,
       MAX(decode(rn, 1, cv, NULL)) cv_1,
       MAX(decode(rn, 2, cn, NULL)) cn_2,
       MAX(decode(rn, 2, cv, NULL)) cv_2,
       MAX(decode(rn, 3, cn, NULL)) cn_3,
       MAX(decode(rn, 3, cv, NULL)) cv_3
       FROM (SELECT id,
                cn,
                cv,
                row_number() over(PARTITION BY id ORDER BY cn, cv) rn
          FROM t_row_col)
    GROUP BY ID;
      

  6.   

    select data_id,area_id,SUBSTR(','||col1||',',INSTR(','||col1||',',',',1,RN)+1,INSTR(','||col1||',',',',1,RN+1)-INSTR(','||col1||',',',',1,RN)-1)
    from (select data_id,area_id,changp1||','||changp2||','||changp3 col1 from a) t1,
    (select rownum rn from dual connect by rownum<=4) t2;
      

  7.   

    select data_id,area_id,decode(t2.rn,1,changp1,2,changp2,3,changp2)
    from t1,
    (select rownum rn from dual connect by rownum<4) t2;
      

  8.   

      bw555  按照你的思路确实能出来 我稍后一定会给分您
     但是 能不能做个标示 来区分 changp1,changp2,changp3 大概意思 是这样:changp_id为标示字段   changp  data_id  area_id    changp_id
        430      001      200910     1
        453      002      200910     1
        102      001      200910     2
        890      002      200910     2
        321      001      200910     3
        432      002      200910     3