求助:以下数据该如何建立数据库表?

xjieloving 2020-03-02 09:43:38


想设计一个值班程序,排班如上图所示,除了节假日,正常工作日中可能涉及的内容有,出勤、休假、补休、值班、病假等内容,请问该如何设计此表结构?
谢谢各位!
...全文
235 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjieloving 2020-03-03
  • 打赏
  • 举报
回复
引用 12 楼 morliz子轩 的回复:
有了这几张基础表,你就可以建立一个视图查询集啊。这个多简单的事。 或者写一个存储方法,写到一个新表中。 但我想说的是,你没有前端,这个考勤的数据记录,你怎么录入进去?
我也是想着建个视图 我先把基础跟问题解决了 前端都比较简单,写个规则生成排班存进数据库就可以了
morliz子轩 2020-03-03
  • 打赏
  • 举报
回复
有了这几张基础表,你就可以建立一个视图查询集啊。这个多简单的事。 或者写一个存储方法,写到一个新表中。 但我想说的是,你没有前端,这个考勤的数据记录,你怎么录入进去?
xjieloving 2020-03-03
  • 打赏
  • 举报
回复
引用 10 楼 morliz子轩 的回复:
--日历表 字段1:id 流水号 字段2:日期(1-30或31天日期) --用户资料表 字段1:id 流水号 字段2: username 用户名 --考勤表 字段1:id 流水号 字段2: 考勤状态(出勤、值班、休假、补休、公差) 字段3:出勤日期 有这3张表,就完全可以实现考勤管理需求。 特别强调的是,日历表的作用,是可用过写存储过程智能跳开,是否为节假休息日。
关键我要现实问题中的效果如何关联查询显示后只显示那三个数据呢?
morliz子轩 2020-03-03
  • 打赏
  • 举报
回复
--日历表 字段1:id 流水号 字段2:日期(1-30或31天日期) --用户资料表 字段1:id 流水号 字段2: username 用户名 --考勤表 字段1:id 流水号 字段2: 考勤状态(出勤、值班、休假、补休、公差) 字段3:出勤日期 有这3张表,就完全可以实现考勤管理需求。 特别强调的是,日历表的作用,是可用过写存储过程智能跳开,是否为节假休息日。
xjieloving 2020-03-03
  • 打赏
  • 举报
回复
引用 8 楼 半杯清茶半杯酒 的回复:
你这个表结构是直接横表结构了,要查询结果的话直接可以关联两张表呀。
我关联后显示内容太多 然后如果写出显示字段就报错
RINK_1 2020-03-03
  • 打赏
  • 举报
回复
引用 7 楼 xjieloving 的回复:
[quote=引用 5 楼 半杯清茶半杯酒 的回复:] [quote=引用 4 楼 xjieloving 的回复:] [quote=引用 3 楼 半杯清茶半杯酒 的回复:] 如果你要纵表那就是2楼说的那样,如果要横表,那么就是ID,用户ID,日期(月份),D1...一直到D31,没有29、30、31的月份就空在那,这样前台界面就不太好看。
如果我纵表设计,建立了表格后 如何显示为上图那样呢? 可否给个例子学习学习?[/quote] 纵表设计就直接百度横表转纵表。。。 我给你一个我很早之前写的你可以看一下。

Select a.EmpID,a.Term,a.ShiftID,b.xType As DayType,'S'+Cast(Day(a.Term) As Varchar) As Term1
	From (
		Select EmpID,Case When Len(D)=2 Then Dateadd(DD,Right(D,1)-1,Term) When Len(D)=3 Then Dateadd(DD,Right(D,2)-1,Term) End As Term,ShiftID
		From aVw_Shift 
		UNPIVOT(ShiftID For D In(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19,S20,S21,S22,S23,S24,S25,S26,S27,S28,S29,S30,S31)) tb
		Where EmpID=@EmpID And Datediff(Month,Term,@Term)=1) a,aT_Calendar b
	Where a.Term=b.Term	
		And Datediff(Month,a.Term,b.Term)=0
其中aWv_Shift为横表,S1/2/3这种就是我上面说的D1/2/3,EmpID为用户标识,aT_Calendar 为日历表。[/quote] 您好,我现在涉及的表结构为 duty_date(日期),duty_id(人员),duty_type(状态),duty_sign(日期类型:如工作日节假日),另外一个表是人员ID对应的name,现在单独表根据查找baidu后得出下面数据, 我想要通过关联ID来显示上述表格,不显示duty_id,duty_sign这两列,该如何修改此SQL语句呢?[/quote] SELECT * FROM (SELECT 指定字段 FROM DUTE_T) AS B PIVOT........)
RINK_1 2020-03-02
  • 打赏
  • 举报
回复
ID,用户ID,日期,考勤类型ID
  • 打赏
  • 举报
回复
你这个表结构是直接横表结构了,要查询结果的话直接可以关联两张表呀。
xjieloving 2020-03-02
  • 打赏
  • 举报
回复
引用 5 楼 半杯清茶半杯酒 的回复:
[quote=引用 4 楼 xjieloving 的回复:] [quote=引用 3 楼 半杯清茶半杯酒 的回复:] 如果你要纵表那就是2楼说的那样,如果要横表,那么就是ID,用户ID,日期(月份),D1...一直到D31,没有29、30、31的月份就空在那,这样前台界面就不太好看。
如果我纵表设计,建立了表格后 如何显示为上图那样呢? 可否给个例子学习学习?[/quote] 纵表设计就直接百度横表转纵表。。。 我给你一个我很早之前写的你可以看一下。

Select a.EmpID,a.Term,a.ShiftID,b.xType As DayType,'S'+Cast(Day(a.Term) As Varchar) As Term1
	From (
		Select EmpID,Case When Len(D)=2 Then Dateadd(DD,Right(D,1)-1,Term) When Len(D)=3 Then Dateadd(DD,Right(D,2)-1,Term) End As Term,ShiftID
		From aVw_Shift 
		UNPIVOT(ShiftID For D In(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19,S20,S21,S22,S23,S24,S25,S26,S27,S28,S29,S30,S31)) tb
		Where EmpID=@EmpID And Datediff(Month,Term,@Term)=1) a,aT_Calendar b
	Where a.Term=b.Term	
		And Datediff(Month,a.Term,b.Term)=0
其中aWv_Shift为横表,S1/2/3这种就是我上面说的D1/2/3,EmpID为用户标识,aT_Calendar 为日历表。[/quote] 您好,我现在涉及的表结构为 duty_date(日期),duty_id(人员),duty_type(状态),duty_sign(日期类型:如工作日节假日),另外一个表是人员ID对应的name,现在单独表根据查找baidu后得出下面数据, 我想要通过关联ID来显示上述表格,不显示duty_id,duty_sign这两列,该如何修改此SQL语句呢?
xjieloving 2020-03-02
  • 打赏
  • 举报
回复
引用 5 楼 半杯清茶半杯酒 的回复:
[quote=引用 4 楼 xjieloving 的回复:] [quote=引用 3 楼 半杯清茶半杯酒 的回复:] 如果你要纵表那就是2楼说的那样,如果要横表,那么就是ID,用户ID,日期(月份),D1...一直到D31,没有29、30、31的月份就空在那,这样前台界面就不太好看。
如果我纵表设计,建立了表格后 如何显示为上图那样呢? 可否给个例子学习学习?[/quote] 纵表设计就直接百度横表转纵表。。。 我给你一个我很早之前写的你可以看一下。

Select a.EmpID,a.Term,a.ShiftID,b.xType As DayType,'S'+Cast(Day(a.Term) As Varchar) As Term1
	From (
		Select EmpID,Case When Len(D)=2 Then Dateadd(DD,Right(D,1)-1,Term) When Len(D)=3 Then Dateadd(DD,Right(D,2)-1,Term) End As Term,ShiftID
		From aVw_Shift 
		UNPIVOT(ShiftID For D In(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19,S20,S21,S22,S23,S24,S25,S26,S27,S28,S29,S30,S31)) tb
		Where EmpID=@EmpID And Datediff(Month,Term,@Term)=1) a,aT_Calendar b
	Where a.Term=b.Term	
		And Datediff(Month,a.Term,b.Term)=0
其中aWv_Shift为横表,S1/2/3这种就是我上面说的D1/2/3,EmpID为用户标识,aT_Calendar 为日历表。[/quote] 我设计 根据您的联系一下 感谢,有问题再请教您
  • 打赏
  • 举报
回复
引用 4 楼 xjieloving 的回复:
[quote=引用 3 楼 半杯清茶半杯酒 的回复:] 如果你要纵表那就是2楼说的那样,如果要横表,那么就是ID,用户ID,日期(月份),D1...一直到D31,没有29、30、31的月份就空在那,这样前台界面就不太好看。
如果我纵表设计,建立了表格后 如何显示为上图那样呢? 可否给个例子学习学习?[/quote] 纵表设计就直接百度横表转纵表。。。 我给你一个我很早之前写的你可以看一下。

Select a.EmpID,a.Term,a.ShiftID,b.xType As DayType,'S'+Cast(Day(a.Term) As Varchar) As Term1
	From (
		Select EmpID,Case When Len(D)=2 Then Dateadd(DD,Right(D,1)-1,Term) When Len(D)=3 Then Dateadd(DD,Right(D,2)-1,Term) End As Term,ShiftID
		From aVw_Shift 
		UNPIVOT(ShiftID For D In(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19,S20,S21,S22,S23,S24,S25,S26,S27,S28,S29,S30,S31)) tb
		Where EmpID=@EmpID And Datediff(Month,Term,@Term)=1) a,aT_Calendar b
	Where a.Term=b.Term	
		And Datediff(Month,a.Term,b.Term)=0
其中aWv_Shift为横表,S1/2/3这种就是我上面说的D1/2/3,EmpID为用户标识,aT_Calendar 为日历表。
xjieloving 2020-03-02
  • 打赏
  • 举报
回复
引用 3 楼 半杯清茶半杯酒 的回复:
如果你要纵表那就是2楼说的那样,如果要横表,那么就是ID,用户ID,日期(月份),D1...一直到D31,没有29、30、31的月份就空在那,这样前台界面就不太好看。
如果我纵表设计,建立了表格后 如何显示为上图那样呢? 可否给个例子学习学习?
  • 打赏
  • 举报
回复
如果你要纵表那就是2楼说的那样,如果要横表,那么就是ID,用户ID,日期(月份),D1...一直到D31,没有29、30、31的月份就空在那,这样前台界面就不太好看。
xjieloving 2020-03-02
  • 打赏
  • 举报
回复
引用 1 楼 RINK_1 的回复:
ID,用户ID,日期,考勤类型ID
这样一个表不就会出现一个日期有N(n=人数)条数据,这样总感觉不太好。 只想寻找一种最好的方式,我先尝试一下,可能我感觉不对而已

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧