暂无图片
请教一个SQL
我来答
分享
暂无图片 匿名用户
请教一个SQL
暂无图片 25M


我有一个试图v_log,记录员工的部门,职位,工资的变动历史,如左图(emid,tp,pfdt,ov,nv,分布是工号,类型,实施日期,修改前的值,修改后的值),例子的数据也如左图,我想把格式做个转置,跟右边一样,怎么写?谢谢

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

col emid for a4;
col 部门_经办日期 for a14;
col 职位_经办日期 for a14;
col 工资_经办日期 for a14;
col 部门_旧值 for a10;
col 职位_旧值 for a10;
col 工资_旧值 for a10;
col 工资_新值 for a10;
col 部门_新值 for a10;
col 职位_新值 for a14;
select * from TAB1 pivot(
LISTAGG(to_char(pfdt,'yyyy-mm-dd') ,chr(10)) WITHIN GROUP (ORDER BY pfdt) "经办日期",
LISTAGG(ov,chr(10)) WITHIN GROUP (ORDER BY pfdt) "旧值",
LISTAGG(nv ,chr(10)) WITHIN GROUP (ORDER BY pfdt) "新值" for TP in('部门' as "部门" ,'工资' as "工资",'职位' as "职位")) order by 1;

EMID 部门_经办日期 部门_旧值 部门_新值 工资_经办日期 工资_旧值 工资_新值 职位_经办日期 职位_旧值 职位_新值
---- -------------- ---------- ---------- -------------- ---------- ---------- -------------- ---------- --------------
A 2024-01-01 D1 D2 2023-10-01 20000 22000
2024-03-01 22000 25000

B 2024-01-01 D2 D3 2024-02-01 软件工程师 高级软件工程师
C 2023-11-01 18000 23000

暂无图片 评论
暂无图片 有用 2
W
w83

select coalesce(a.emid,b.emid,c.emid) as emid
,a.pfdt as d_pfdt
,a.ov as d_ov
,a.nv as d_nv
,b.pfdt as s_pfdt
,b.ov as s_ov
,b.nv as s_nv
,c.pfdt as p_pfdt
,c.ov as p_ov
,c.nv as p_nv
from
(
select emid,pfdt,ov,nv,row_number() over(partition by emid order by pfdt) as sn
from v_log
where tp = '部门'
) a
full join
(
select emid,pfdt,ov,nv,row_number() over(partition by emid order by pfdt) as sn
from v_log
where tp = '工资'
) b
on a.emid = b.emid
and a.sn = b.sn
full join
(
select emid,pfdt,ov,nv,row_number() over(partition by emid order by pfdt) as sn
from v_log
where tp = '职位'
) c
on a.emid = c.emid
and a.sn = c.sn
;

SQL没实际跑过,可能需要调下。 大致思路就这样。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏