暂无图片
请教个SQL
我来答
分享
刘晓华
2024-08-27
请教个SQL
暂无图片 25M

表T有5个字段emid,c1,c2,c3,dt分别代表工号,字段1,字段2,字段3和日期,数据如左图,我想按得到右边的结果,即:同一个工号,如果同一个日期有两行或三行则“压缩”成一行,怎么弄?

谢谢!



我来答
添加附件
收藏
分享
问题补充
6条回答
默认
最新
孙莹

drop table t;
create table t (emid varchar(20),c1 varchar(20),c2 varchar(20),c3 varchar(20),dt date);
insert into t values('A','V1',null,null,to_date('2024-08-25','yyyy-mm-dd'));
insert into t values('A',null,'V2',null,to_date('2024-08-25','yyyy-mm-dd'));
insert into t values('A',null,null,'V3',to_date('2024-08-25','yyyy-mm-dd'));
insert into t values('A',null,'V4',null,to_date('2024-08-27','yyyy-mm-dd'));
insert into t values('A','V5',null,null,to_date('2024-08-28','yyyy-mm-dd'));
commit;
select * from t;
select emid,max(c1) c1,max(c2) c2,max(c3) c3,dt from t group by emid,dt order by emid,dt;


暂无图片 评论
暂无图片 有用 1
打赏 0
暂无图片
范达宏

这种情况记得把建表,初始化数据的语句发出来

暂无图片 评论
暂无图片 有用 0
打赏 0
一一

select emid,max(c1) as c1,max(c2) as c2,max(c3) as c3,dt from t group emid,dt

暂无图片 评论
暂无图片 有用 1
打赏 0
范达宏

SELECT
emid,
dt,
LISTAGG(c1, ', ') WITHIN GROUP (ORDER BY ROWID) AS c1_combined,
LISTAGG(c2, ', ') WITHIN GROUP (ORDER BY ROWID) AS c2_combined,
LISTAGG(c3, ', ') WITHIN GROUP (ORDER BY ROWID) AS c3_combined
FROM T
GROUP BY emid, dt;

暂无图片 评论
暂无图片 有用 0
打赏 0
forever

SELECT

Emid,LISTAGG(c1,',') WITHIN GROUP (ORDER BY C1) AS C1,

LISTAGG(c2,',') WITHIN GROUP (ORDER BY c2) AS C2,

LISTAGG(c3,',') WITHIN GROUP (ORDER BY c3) AS C3,

Dt

FROM t

GROUP BY Emid,dt;

暂无图片 评论
暂无图片 有用 0
打赏 0
Thomas

是否有可能有两条记录,其Emid,dt都相同,且c1都有值?如果是这样,那用listaggr的写法满足要求。

暂无图片 评论
暂无图片 有用 0
打赏 0
刘晓华
题主
2024-09-18
前几天用listagg写了出来了,谢谢Thomas
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏