+ -
当前位置:首页 → 问答吧 → 求在1句sql里能将行转列后的结果与另2个表连接

求在1句sql里能将行转列后的结果与另2个表连接

时间:2010-08-19

来源:互联网

t表如下;

         I A          D
---------- ---------- -------------------
         1 b          2008
         1 a          2007
         1 d          2008
         2 z          2008
         2 t          2008
我用以下语句行转列
select i,ltrim(max(sys_connect_by_path(a,',')),',') a
from
(
select i,a,d,min(d) over(partition by i) d_min,
(row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
from t
)
start with d=d_min connect by numid-1=prior numid
group by i;

得到表
I   A
1  d,b,a
2  z,t

然后,还想将这个结果与另2个表t1,t2连结,在结果里增加来自t1,t2的列,该如何做(在1条sql里)
t1如下
I   v1
1    11
2    22

t2如下
I   v2
1    111
2    222

最终想得到表如下
I   A           v1     v2
1  d,b,a      11     111
2  z,t          22     222

作者: blackantt   发布时间: 2010-08-19

既然第一个已经完成了。后面的就简单了吧。
把你完成的那个当成一个表来处理就OK。

作者: renxiao2003   发布时间: 2010-08-19

恩  复杂的语句影响系统将来的效率

作者: duolanshizhe   发布时间: 2010-08-19

不过列换行,复杂无法避免。。。
  1. select * from
  2. (SELECT t.i , MAX(substr(sys_connect_by_path(t.a, ','), 2)) str
  3.   FROM (SELECT i, a, row_number() over(PARTITION BY i ORDER BY a) rn
  4.           FROM t) t
  5. START WITH rn = 1
  6. CONNECT BY rn = PRIOR rn + 1
  7.       AND i = PRIOR i
  8. GROUP BY t.i) a left join v1 b on a.i=b.i
  9. left join v2 c on a.i=c.i
复制代码

作者: toniz   发布时间: 2010-08-19

oracle 10g以后,倒是有简单的方法取。
  1. SELECT ID,
  2.       REPLACE(WMSYS.WM_CONCAT(NAME),',','/') "NEW_NAME"
  3.   FROM TABLE_NAME TT
  4. GROUP BY ID;
复制代码

作者: toniz   发布时间: 2010-08-19