17,089
社区成员
发帖
与我相关
我的任务
分享
和此例相同.
请教一条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;