原数据,可以填报,后期数据会变动,新增或减少
sqlserver 可以用下列方法
with t as ( -- 原始数据
select 1 as id,'aaa' name,'A' job
union all select 2,'aba','A'
union all select 3,'xxz','A'
union all select 4,'fee','B'
union all select 5,'3fee','B'
union all select 6,'f5ee','B'
union all select 7,'f4ee','B'
union all select 8,'fe8e','B'
union all select 9,'fe0e','B'
union all select 16,'tte','Bc'
union all select 17,'xtxt','Bc'
union all select 18,'uyuy','Bc'
union all select 19,'zzz','Bc'
),t1 as ( -- 按job划分每个人需要的值班序号
select *,row_number() over(partition by job order by id) wid from t
),t2 as ( -- 获得每个班有多少人进行轮班
select job,max(wid) nums from t1 group by job
)
select * -- 最后按照班列出今天需要排班的人
from (
select name,a.job
from t1 a
left join t2 b on a.job=b.job
-- 获得自2023年3月1日开始排版后,今天需要排班的人员
where datediff(d,'2023-3-1',getdate()) % nums = wid - 1
) a
pivot(max(name) for job in (A,B,Bc)) p -- 这里需要把所有的班名都列出
1. 表中的任何列都可以作为主键,只要它满足一下条件:
1. 任意两行都不具有相同的主键值。
2. 每一行都必须具有一个主键值(主键列不允许NULL值)
3. 主键列中的值不允许修改或更新
4. 主键值不能重用(如果某行从表中删除,它的主键不能赋值给以后的新行)
2. 主键通常定义在表的一列上,但并不是必须这么做,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到所有列,所有列值得组合必须是唯一的(但单个列的值可以不唯一)