新手求助行转列问题

tzbzll 2007-09-26 12:19:24
求助,工作中遇见一个问题:
表t1
id name
1 a
1 b
2 a
2 c
2 d
转成
表t2
id name
1 a,b
2 a,c,d
请大家指教啊!!!多谢
注意不能用sys_connect_by_path,因为在connect by 的时候由于层次太多了,有4000层,导致性能不能满足。
我原来的写法是:
select v.id,substr(MAX(sys_connect_by_path(v.name, '|')), 2) as name
from (select t1.id,row_number() over(PARTITION BY t1.id ORDER BY t1.name)rn from t1)v start with v.rn = 1 connect by v.id= PRIOR v.id
and v.rn - 1 = PRIOR v.rn GROUP BY v.id

...全文
145 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2007-10-16
  • 打赏
  • 举报
回复
和此例相同.
请教一条SQL
NAME USERID
张三 KB001
张三 KB002
李四 KB001
李四 KB002
李四 KB003

我想用SQL实现表示如下:
NAME USERID
张三 KB001,KB002
李四 KB001,KB002,KB003



select cola,rtrim(
max(decode(colb,'KB001',colb||',',null))||
max(decode(colb,'KB002',colb||',',null))||
max(decode(colb,'KB003',colb||',',null)),',')
from test
group by cola
/

COLA RTRIM(MAX(DECODE(COLB,'KB001',COL
---------- ---------------------------------
李四 KB001,KB002,KB003
张三 KB001,KB002






With x As (
SELECT '张三' NAME, 'KB001' userid FROM dual UNION ALL
SELECT '张三' NAME, 'KB002' userid FROM dual UNION ALL
SELECT '李四' NAME, 'KB001' userid FROM dual UNION ALL
SELECT '李四' NAME, 'KB002' userid FROM dual UNION ALL
SELECT '王五' NAME, 'KB006' userid FROM dual UNION ALL
SELECT '王五' NAME, 'KB002' userid FROM dual UNION ALL
SELECT '李四' NAME, 'KB003' userid FROM dual)
SELECT NAME, ltrim(MAX(sys_connect_by_path(userid, ',')), ',') userid
FROM (SELECT NAME, userid, row_number() over(PARTITION BY NAME ORDER BY userid) rn, rownum prn FROM x)
START WITH rn = 1
CONNECT BY prn - 1 = PRIOR prn AND NAME = PRIOR NAME
GROUP BY NAME
ORDER BY NAME;

结果:
NAME USERID
1 李四 KB001,KB002
2 王五 KB002
3 张三 KB001,KB002
这里的“王五”信息不全。

with x AS (
SELECT '张三' NAME, 'KB101' userid FROM dual UNION ALL
SELECT '张三', 'KB002' FROM dual UNION ALL
SELECT '张三', 'KB113' FROM dual UNION ALL
SELECT '张三', 'KB003' FROM dual UNION ALL
SELECT '张三', 'KB004' FROM dual UNION ALL
SELECT '张三', 'KB005' FROM dual UNION ALL
SELECT '张三', 'KB013' FROM dual UNION ALL
SELECT '张三', 'KB103' FROM dual UNION ALL
SELECT '李四', 'KB001' FROM dual UNION ALL
SELECT '李四', 'KB002' FROM dual UNION ALL
SELECT '王五', 'KB002' FROM dual UNION ALL
SELECT '王五', 'KB006' FROM dual UNION ALL
SELECT '李四', 'KB003' FROM dual)
--//--直接提取法
SELECT NAME, ltrim(MAX(sys_connect_by_path(userid, ',')), ',') userid
FROM (SELECT NAME, userid, row_number() over(PARTITION BY NAME ORDER BY userid) rn FROM x)
START WITH rn = 1 CONNECT BY rn - 1 = PRIOR rn AND NAME = PRIOR NAME GROUP BY NAME ORDER BY NAME;

douyalove 2007-10-16
  • 打赏
  • 举报
回复
我也有发了一个这个问题,可还没解决啊
liuzi123 2007-09-27
  • 打赏
  • 举报
回复
关注下
tzbzll 2007-09-26
  • 打赏
  • 举报
回复
问题1已解决:用了这个函数INSTR(v_sum, v_row, -1, 1) = 0
tzbzll 2007-09-26
  • 打赏
  • 举报
回复
感谢hongqi162(失踪的月亮),他的方法基本是可以的,但是初步测试还存在两个问题:(1)解决数据重复问题,比如存在两条1 aa,怎么样只记录一次(2)由于数据我的数据量较大,效率不高,而且出现执行一半,pl/sql developer自动关闭了,不知道是怎么回事。自己再看看!
hongqi162 2007-09-26
  • 打赏
  • 举报
回复
你参考一下上面的代码
hongqi162 2007-09-26
  • 打赏
  • 举报
回复
--测试数据
create table tbale1(no int, content varchar2(100));
insert into tbale1
select 1,'aa' from dual union all
select 1,'bb' from dual union all
select 1,'cc' from dual union all
select 2,'mm' from dual union all
select 2,'nn' from dual union all
select 3,'oo' from dual;
--建立函数
create or replace function sum_string(v_sql varchar2)
return varchar2
as
type cur_alldata is ref cursor;
l_alldata cur_alldata;
v_row varchar2(99);
v_sum varchar2(3999);
begin
open l_alldata for v_sql;
loop
fetch l_alldata into v_row;
exit when l_alldata%notfound;
v_sum := v_sum||','||v_row;
end loop;
v_sum := substr(v_sum,2);
close l_alldata;
return v_sum;
end;
--执行查询
select distinct no,sum_string('select content from tbale1 where no='''||no||''' group by no,content') from tbale1
--执行结果
1 aa,bb,cc
2 mm,nn
3 oo
hebo2005 2007-09-26
  • 打赏
  • 举报
回复
最近问这个问题特别多噢,这种最好用存储过程或者函数来做,效率会高点
随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提出一种更高的要求,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度出发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧