表FID   PID  PNAME
 1     1     'aa'
 2     1     'bb'
 3     2     'cc'
 4     2     'dd'
 5     2     'ee'
 6     3     'ff'需要的结果如下;
 PID  PNAMES
  1    ‘aabb'
  2     'ccddee'
  3     'ff'

解决方案 »

  1.   

    网上有利用递归函数+分析函数实现的方法。但是这种sql出来后,完全没有可读性了。除了你当时写出来,以后没人看得懂。
    建议利用过程或者函数来实现对应功能。
      

  2.   

    SQL> WITH test AS
      2  (
      3  SELECT 1 AS FID,    1 AS PID,    'aa' AS PNAME FROM DUAL UNION
      4  SELECT 2 AS FID,    1 AS PID,    'bb' AS PNAME FROM DUAL UNION
      5  SELECT 3 AS FID,    2 AS PID,    'cc' AS PNAME FROM DUAL UNION
      6  SELECT 4 AS FID,    2 AS PID,    'dd' AS PNAME FROM DUAL UNION
      7  SELECT 5 AS FID,    2 AS PID,    'ee' AS PNAME FROM DUAL UNION
      8  SELECT 6 AS FID,    3 AS PID,    'ff' AS PNAME FROM DUAL
      9  )
     10  SELECT pid,REPLACE(WMSYS.WM_CONCAT(PNAME),',','')
     11  FROM test
     12  GROUP BY PID;
     
           PID REPLACE(WMSYS.WM_CONCAT(PNAME)
    ---------- --------------------------------------------------------------------------------
             1 aabb
             2 cceedd
             3 ff
     
    SQL> 
      

  3.   

    SQL> WITH test AS
      2  (
      3  SELECT 1 AS FID,    1 AS PID,    'aa' AS PNAME FROM DUAL UNION
      4  SELECT 2 AS FID,    1 AS PID,    'bb' AS PNAME FROM DUAL UNION
      5  SELECT 3 AS FID,    2 AS PID,    'cc' AS PNAME FROM DUAL UNION
      6  SELECT 4 AS FID,    2 AS PID,    'dd' AS PNAME FROM DUAL UNION
      7  SELECT 5 AS FID,    2 AS PID,    'ee' AS PNAME FROM DUAL UNION
      8  SELECT 6 AS FID,    3 AS PID,    'ff' AS PNAME FROM DUAL
      9  )
     10  SELECT DISTINCT pid, REPLACE(wmsys.wm_concat(pname)over (PARTITION BY pid  ),',','')  AS C_PNAME
     11   FROM
     12  TEST
     13  ORDER BY PID
     14  ;
     
           PID C_PNAME
    ---------- --------------------------------------------------------------------------------
             1 aabb
             2 ccddee
             3 ff