sql 数据库 数据循环展示 ,并根据时间参数筛选

原数据,可以填报,后期数据会变动,新增或减少

img


想实现的功能,比如厂级有6条数据,就六天一循环,电工有4条数据,就四天一循环,后期数据源变化,循环天数也跟着变化

img

sqlserver 可以用下列方法

img



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 -- 这里需要把所有的班名都列出

img

  • 这篇文章:sql 报错注入 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: SQL必知必会中的 应该总是定义主键:虽然并不总是需要主键,但多数数据库设计者都会保证他们创建的每个表具有一个主键,以便于以后的数据库操作和管理。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1. 表中的任何列都可以作为主键,只要它满足一下条件:
    	1. 任意两行都不具有相同的主键值。
    	2. 每一行都必须具有一个主键值(主键列不允许NULL值)
    	3. 主键列中的值不允许修改或更新
    	4. 主键值不能重用(如果某行从表中删除,它的主键不能赋值给以后的新行)
    2. 主键通常定义在表的一列上,但并不是必须这么做,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到所有列,所有列值得组合必须是唯一的(但单个列的值可以不唯一)