首页 / MYSQL / MySql的出勤报告
MySql的出勤报告
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySql的出勤报告,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2597字,纯文字阅读大概需要4分钟。
内容图文
![MySql的出勤报告](/upload/InfoBanner/zyjiaocheng/887/e20728dbe3eb426dac2fed9dbdb3244a.jpg)
我想编写一个查询以生成员工的出勤报告.首先,我将告诉您如何在数据库中存储员工的状态.
我有下表.
Employee Table with Columns
emp_id emp_Name Joining_Date
1 john 11-01-2012
2 Scott 12-01-2012
Holiday Table
Holiday_Name Date
Chrismas 25-12-2012
Dushera 08-03-2012
Independance Day 15-08-2012
Leave Table
Subject from_Date to_Date Emp_Id status
PL 02-01-2012 04-01-2012 1 Approved
CL 11-01-2012 12-01-2012 2 Declined
Doctor Table
Subject Call_Date call_Done_By(emp_id)
Call 15-01-2012 1
CA 21-02-2012 2
Chemist Table
Subject Call_Date call_Done_By(emp_id)
Chemist 1-02-2012 2
Texo 21-03-2012 1
如果向员工看望医生或化学家,则该特定日期与employee_id一起存储在该特定医生或化学家表中
现在,人们将选择年份和月份,他应该能够以以下格式获取出勤报告
示例:假设用户选择年为“ 2011”,月为“ Dec”,则输出应为
Employee year Month 1 2 3 4 5 6 7....
John 2011 Nov Y Y Y Y Y L S....
Scott 2011 Nov Y Y L M Y L S
这里的输出1,2,3 ….是0-30天的一个月,我们可以使用’case’来写
考虑是否有员工在场,将其状态显示为“ Y”,否则显示L
如果他去过任何医生,化学家等客户,则将其替换为“ S”.
那么我应该如何编写查询以实现此输出呢?
任何建议对我都会有帮助.
解决方法:
这是应该可以正常工作的很长的路要走:
SELECT
Employee.emp_Name,
'2011' AS `Year`,
'Dec' AS `Month`,
CASE (
IF(
DATE('1-12-2011') < DATE(Employee.Joining_Date)),
'0' --Not joined yet
IF (
(SELECT COUNT(*) FROM Holiday WHERE DATE('1-12-2011') = DATE(Holiday.date)) = 1,
'1', --National Holiday
IF (
(SELECT COUNT(*) FROM Leave WHERE DATE('1-12-2011') > DATE(Leave.to_Date) AND DATE('1-12-2011') < DATE(Leave.from_Date) AND Leave.Emp_Id = Employee.emp_id) = 1,
'2', --On Leave
IF(
(SELECT COUNT(*) FROM Doctor WHERE DATE('1-12-2011') > DATE(Doctor.Call_Date) AND Doctor.call_Done_By = Employee.emp_id) = 1 OR
(SELECT COUNT(*) FROM Chemist WHERE DATE('1-12-2011') > DATE(Chemist.Call_Date) AND Chemist.call_Done_By = Employee.emp_id) = 1,
'3' --Visit Doctor or Chemist
'4' --Employee was at work
)
)
)
)
)
WHEN 0 THEN 'N/A' --Not joined yet
WHEN 1 THEN 'L' --National Holiday
WHEN 2 THEN 'L' --On Leave
WHEN 3 THEN 'S' --Visit Doctor or Chemist
ELSE 'Y' --Employee was at work
END AS `1`, --first day of month
... AS `2`, --repeat for second day of the month till max day of current month replace '1-12-2011' with each different day of month
...
... AS `30`
FROM
Employee
我的建议是创建一个视图,该视图为每个员工执行if语句,这样您的代码将更易于维护.请记住,这是伪代码,可能需要进行一些更改才能运行.
希望这可以帮助.
内容总结
以上是互联网集市为您收集整理的MySql的出勤报告全部内容,希望文章能够帮你解决MySql的出勤报告所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。