这个sql怎么写

表emp
id    name
a      1
b      1
c      1
d      2
e      2
f      2
g      3
--------------
查询结果要是
a    d   g
b    e
c    f

就是把name 相同的放到同一列 按照顺序依次 如果不够的话就为空,如果多的话也要列出来
我也来说两句 查看全部回复

最新回复

  • chonglei (2008-7-30 14:52:52)

    SELECT RNO, MAX(SYS_CONNECT_BY_PATH(ID, ' '))
      FROM (SELECT ID,
                   RNO,
                   ROW_NUMBER() OVER(PARTITION BY RNO ORDER BY RNO) AS NO,
                   ROW_NUMBER() OVER(ORDER BY RNO) + RNO AS NNO
              FROM (SELECT ID,
                           ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) AS RNO
                      FROM empT) A) B
    START WITH NO = 1
    CONNECT BY NNO - 1 = PRIOR NNO
    GROUP BY RNO
    ORDER BY RNO
  • jack913.fan (2008-7-30 22:01:31)

    SQL> select * from B1;

    ID       NAME
    -- ----------
    A           1
    B           1
    C           1
    D           2
    E           2
    F           2
    G           3

    7 rows selected

    SQL>
    SQL> SELECT ID1,ID2,ID3 FROM
      2    (select ROWNUM RN1,ID ID1 from B1 WHERE NAME=1) A,
      3    (select  ROWNUM RN2,ID ID2 from B1 WHERE NAME=2) B,
      4    (select  ROWNUM RN3,ID ID3 from B1 WHERE NAME=3) C
      5  WHERE RN1=RN2(+) AND RN1=RN3(+)
      6  /

    ID1 ID2 ID3
    --- --- ---
    A   D   G
    B   E   
    C   F   

    SQL>
  • jack913.fan (2008-7-30 22:07:27)

    我这样写仅供参考
    我的写法有两个不足之处:
    1.要晓得NAME的DISTINCT的个数,如果个数少就还好,多的化,这种写法就不行了
    2.要知道哪个NAME对应的ID最多,这样方便做左联结

    期待高手出现!
  • sieper (2008-7-31 09:14:45)

    写的不错哈
    请教这个加号 的含义 。一直没明白
    WHERE RN1=RN2(+) AND RN1=RN3(+)
  • jack913.fan (2008-7-31 10:15:40)

    (+)是外连接的意思
    SQL> select * from b;
    ID         NAME
    ---------- ----------
    A          1
    B          1
    C          1
    D          2
    E          2
    F          2
    G          3
    已选择7行。
    SQL> select max(decode(name,1,id,null)),
      2  max(decode(name,2,id,null)),
      3  max(decode(name,3,id,null))
      4  from
      5  (
      6  select id,name,row_number() over(partition by name order by id) rn from b)
      7  group by rn
      8  /
    MAX(DECODE MAX(DECODE MAX(DECODE
    ---------- ---------- ----------
    A          D          G
    B          E
    C          F
    SQL>

    这个借鉴别人的一个写法更加简单!
  • sieper (2008-7-31 11:51:00)

    这个是介于牛a和牛c之间的一个写法