sql关于学生考勤统计~~谢谢各位大神了,在线等!!!!

yangjiajie0110 2015-04-19 07:47:23

1.学生表(Student):包括学号(s_number),姓名(s_name),联系方式(mobil),班级(class)
2.签到表:包括姓名(name),签到日期(checkdate),签到时间(checktime)
想做一个每个人每天的统计考勤表,
包括学生学号,姓名,班级,联系方式,考勤状态,考勤日期
算法就是将每个人每天的考勤时间按升序排列,认为奇数次签到为上课签到,偶数次签到为下课时间,
如果下课时间-上课时间=45则为正常;
下课时间-上课时间<45则为迟到/早退。
谢谢各位了!
...全文
350 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
造几条数据,测试下呗
  • 打赏
  • 举报
回复
表里面没插入数据,当然没有数据咯
还在加载中灬 2015-04-20
  • 打赏
  • 举报
回复
你只需要把这段中的表变量表名换成你的表名 把下面的@Student @CHECK换成你的表名 SELECT S.[S_Number] '学号' , S.[S_Name] '姓名' , S.[Class] '班级' , S.[Mobile] '联系方式' , CASE WHEN DATEDIFF(MM,ISNULL(C2.[CheckTime],GETDATE()),ISNULL(C1.[CheckTime],GETDATE())) = 45 THEN 'Normal' WHEN DATEDIFF(MM,ISNULL(C2.[CheckTime],GETDATE()),ISNULL(C1.[CheckTime],GETDATE())) <45 THEN 'Late/Early' ELSE 'Exception' END AS '考勤情况' , C1.[CheckDate] '考勤日期' FROM @Student S LEFT JOIN (SELECT S_Name, CheckDate,CheckTime, ROW_NUMBER() OVER(PARTITION BY S_Name ORDER BY CheckDate ASC ,CheckTime ASC ) CN FROM @Check) C1 ON C1.S_Name = S.S_Name AND C1.CN%2 =1 LEFT JOIN (SELECT S_Name, CheckDate,CheckTime, ROW_NUMBER() OVER(PARTITION BY S_Name ORDER BY CheckDate ASC ,CheckTime ASC ) CN FROM @Check) C2 ON C2.S_Name = S.S_Name AND C2.CN%2 =0
yangjiajie0110 2015-04-20
  • 打赏
  • 举报
回复
我表里有数据呀@XIN_WILLIAM
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
我的表是Student和Tab_Check,我把您写的改成@Student和@Tab_Check,但是执行之后还是没数据@hery2002
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
方便加你的一个联系方式嘛,这么晚了,快点弄完也不打扰您休息了@hery2002
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
我换了之后显示TABLE附近有语法错误!!! DECLARE Student TABLE ( S_Number INT , S_Name VARCHAR(10) , Mobile VARCHAR(20) , Class VARCHAR(10) ) @hery2002
hery2002 2015-04-19
  • 打赏
  • 举报
回复
你要把@Student 和@Check 替换成你实际的表。
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
USE [FPAttendance] GO /****** 对象: Table [dbo].[Tab_Check] 脚本日期: 04/19/2015 22:13:54 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO DECLARE @Student TABLE ( S_Number INT , S_Name VARCHAR(10) , Mobile VARCHAR(20) , Class VARCHAR(10) ) ; DECLARE @Check TABLE ( S_Name VARCHAR(10) , CheckDate DATETIME , CheckTime DATETIME ) ; SELECT S.[S_Number] '学号' , S.[S_Name] '姓名' , --S.[Class] '班级' S.[Mobile] '联系方式' , CASE WHEN DATEDIFF(MM,ISNULL(C2.[CheckTime],GETDATE()),ISNULL(C1.[CheckTime],GETDATE())) = 45 THEN 'Normal' WHEN DATEDIFF(MM,ISNULL(C2.[CheckTime],GETDATE()),ISNULL(C1.[CheckTime],GETDATE())) <45 THEN 'Late/Early' ELSE 'Exception' END AS '考勤情况' , C1.[CheckDate] '考勤日期' FROM @Student S LEFT JOIN (SELECT S_Name, CheckDate,CheckTime, ROW_NUMBER() OVER(PARTITION BY S_Name ORDER BY CheckDate ASC ,CheckTime ASC ) CN FROM @Check) C1 ON C1.S_Name = S.S_Name AND C1.CN%2 =1 LEFT JOIN (SELECT S_Name, CheckDate,CheckTime, ROW_NUMBER() OVER(PARTITION BY S_Name ORDER BY CheckDate ASC ,CheckTime ASC ) CN FROM @Check) C2 ON C2.S_Name = S.S_Name AND C2.CN%2 =0; 这是我粘到查询器里的,您看对嘛@hery2002
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
但是执行后就有表头,没有具体的内容
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
您说的表变量是如"@Student"这个吧,我表就叫Student,应该不用改吧~~@hery2002
hery2002 2015-04-19
  • 打赏
  • 举报
回复
没有特殊的函数,05应该可以吧, 你把表变量换成你实际的表试试, 我的语句中用的表变量
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
@hery2002 ,方便加你一个联系方式么,我qq是864657636,我自己试了一下,不行,麻烦了!!!
yangjiajie0110 2015-04-19
  • 打赏
  • 举报
回复
@hery2002 ,太谢谢你,不过我想再问一下我用的是SQL2005,直接复制过去就可以了嘛,因为是初学者,拜托了
hery2002 2015-04-19
  • 打赏
  • 举报
回复

USE AdventureWorks2012;
GO
DECLARE @Student TABLE
(
	S_Number INT
,	S_Name VARCHAR(10)
,	Mobile VARCHAR(20)
,	Class VARCHAR(10)
)
;
DECLARE @Check TABLE
(
	S_Name VARCHAR(10)
,	CheckDate DATETIME
,	CheckTime DATETIME
)
;

SELECT 
	S.[S_Number] '学号'
,	S.[S_Name] '姓名'
,	S.[Class] '班级'
,	S.[Mobile]  '联系方式'
,	CASE WHEN DATEDIFF(MM,ISNULL(C2.[CheckTime],GETDATE()),ISNULL(C1.[CheckTime],GETDATE())) = 45 THEN 'Normal'
			  WHEN DATEDIFF(MM,ISNULL(C2.[CheckTime],GETDATE()),ISNULL(C1.[CheckTime],GETDATE())) <45 THEN 'Late/Early'
			  ELSE 'Exception' END AS '考勤情况'
,	C1.[CheckDate] '考勤日期'

FROM @Student S 
LEFT JOIN (SELECT S_Name, CheckDate,CheckTime, 
                               ROW_NUMBER() OVER(PARTITION BY S_Name ORDER BY CheckDate ASC ,CheckTime ASC ) CN FROM @Check) C1  
			ON C1.S_Name = S.S_Name AND C1.CN%2 =1
LEFT JOIN (SELECT S_Name, CheckDate,CheckTime, 
                                ROW_NUMBER() OVER(PARTITION BY S_Name ORDER BY CheckDate ASC ,CheckTime ASC ) CN FROM @Check) C2 
			ON C2.S_Name = S.S_Name AND C2.CN%2 =0
;

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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