表A中存储数据为:id   name   age     sex 
1   李四   20      女
1   王五   30      男
                  1    张三   40      女
求一这样显示数据的sql语句:id          name-age                sex
1      李四-20/王五-30/张三-40   女/男/女                             select (name||’-‘||age  ) name-age ,sex from A  这条只是得到横着的拼接,还需要求上下拼接的!谢谢!

解决方案 »

  1.   

    SQL> select * from t1;
     
            ID NAME                        AGE SEX
    ---------- -------------------- ---------- ----------
             1 张三                         20 女
             1 李四                         30 女
             2 王五                         60 男
    SQL> select id,
      2  max(substr(SYS_CONNECT_BY_PATH("name-age",'/'),2)) "name-age",
      3  max(substr(SYS_CONNECT_BY_PATH(sex,'/'),2)) sex
      4  from
      5  (
      6  select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
      7  )
      8  connect by prior rn = rn-1
      9  group by id
     10  ;
     
            ID name-age                                                                         SEX
    ---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
             1 张三-20/李四-30                                                                  女/女
             2 王五-60                                                                          男
     
      

  2.   

    max(substr(SYS_CONNECT_BY_PATH("name-age",'/'),2)) "name-age",
    这条语句没看懂,请帮我解释一下,谢谢!
      

  3.   

    http://blog.csdn.net/wh62592855/archive/2009/10/29/4745592.aspx
      

  4.   

    ("name-age",'/')  name-age这个不明白
      

  5.   

    select id,
      2 max(substr(SYS_CONNECT_BY_PATH("name-age",'/'),2)) "name-age",
      3 max(substr(SYS_CONNECT_BY_PATH(sex,'/'),2)) sex
      4 from
      5 (
      6 select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
      7 )
      8 connect by prior rn = rn-1
      9 group by id
    这有一个差不多对,但是如果ID为1的有很多很多个,它就会截断一部分
      

  6.   

    SQL> insert into t1 select * from t1 where id = 1;
     
    2 rows inserted
     
    SQL> select * from t1;
     
            ID NAME                        AGE SEX
    ---------- -------------------- ---------- ----------
             1 张三                         20 女
             1 李四                         30 女
             2 王五                         60 男
             1 张三                         20 女
             1 李四                         30 女
     
    SQL> 
    --正常啊
    SQL> select id,
      2  max(substr(SYS_CONNECT_BY_PATH("name-age",'/'),2)) "name-age",
      3  max(substr(SYS_CONNECT_BY_PATH(sex,'/'),2)) sex
      4  from
      5  (
      6  select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
      7  )
      8  connect by prior rn = rn-1
      9  group by id
     10  ;
     
            ID name-age                                                                         SEX
    ---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
             1 张三-20/李四-30/李四-30/张三-20                                                  女/女/女/女
             2 王五-60                                                                          男
     
    SQL>
      

  7.   

    没看懂为啥要套个max函数上去,高手能解释下不
      

  8.   

    -- Create table
    create table TEST1
    (
      ID   NUMBER,
      NAME VARCHAR2(2000),
      AGE  VARCHAR2(2000),
      SEX  VARCHAR2(2000)
    )
    tablespace BIZ_DATASPACE
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
      

  9.   

    都这么长度的定义了,还弹出ORA-01489 字符串连接的结果过长 ??
      

  10.   

    写个函数吧,为啥一定要用sql实现呢,怪累的
      

  11.   

    现在想知道sql这么写?程序知道怎么实现的了
      

  12.   

    SELECT * FROM (
     select id,
        substr(SYS_CONNECT_BY_PATH("name-age",'/'),2) nameage,
        substr(SYS_CONNECT_BY_PATH(sex,'/'),2) sex  ,
        CONNECT_BY_ISLEAF leaf
        
        from
        (
        select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
        )     
        START WITH rn=1
        connect by prior rn = rn-1 AND PRIOR  ID=ID )
      WHERE leaf=1  
      ;
    这个应该可以了,在4楼基础上改进了下
      

  13.   

    SQL> select * from t1;
     
     ID NAME        AGE SEX
    --- ---------- ---- -----
      1 张三         20 女
      1 李四         30 女
      2 王五         60 男
      1 赵六         22 男
      2 苏三         33 女
      2 周九         44 男
     
    6 rows selected
     
    SQL> 
    SQL> SELECT * FROM
      2      (
      3       select id, substr(SYS_CONNECT_BY_PATH("name-age",'/'),2) nameage,substr(SYS_CONNECT_BY_PATH(sex,'/'),2) sex,CONNECT_BY_ISLEAF leaf
      4         from
      5          (
      6          select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
      7          )
      8        START WITH rn=1
      9      connect by prior rn = rn-1 AND PRIOR  ID=ID
     10      )
     11   WHERE leaf=1 ;
     
     ID NAMEAGE                                                                          SEX                                                                                    LEAF
    --- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------
      1 李四-30/赵六-22/张三-20                                                          女/男/女                                                                                  1
      2 苏三-33/周九-44/王五-60                                                          女/男/男                                                                                  1
     
    SQL>
      

  14.   

    4楼的问题在于对string用max不能选出最长的串。
      

  15.   

     select id,
            replace(wm_concat(name || '-' || age) ||' '||
                    wm_concat(sex), ',', '/') 
       from t
      group by id
     
    直接用wm_concat这个函数就可以了