打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于员工考勤的问题.

关于员工考勤的问题.
有4个表,分别如下.

员工表:
-----------------------------
员工编号  员工姓名
1         张三
2         李四

班别表:
-------------------------------------
班别编号  班别名称
-------------------------------------
1         员工班别
2         保安早班
3         保安中班
4         保安晚班

班次表:
-----------------------------------------
班别编号  班次编号   班次名称   时间
-----------------------------------------
1         1          上午上班   08:00
1         2          上午下班   12:00
1         3          下午下班   14:00
1         4          下午下班   18:00
2         1          上班       08:00
2         2          下班       16:00
3         1          上班       16:00
3         2          下班       00:00
4         1          上班       00:00
4         2          下班       08:00

考勤登记表:
-----------------------------------------
员工编号  班别编号   班次编号  登记日期  登记时间
------------------------------------------------------
1         1          1         2006/5/1  08:00

要求写一个查询,查出某一个编号的员工一个月内某一个班别的考勤.

比如: 员工1 (可能是保安,保安一个月内的班别是会变化的) 2006年1月保安早班考勤:

员工1 保安早班考勤:
----------------------------------------
登记日期   上班时间   下班时间
------------------------------------
除开上面的疑问,此题的解如下:(结果集中你想要的字段多少你可以自行在SELECT后面加入/减少)
-------------------------------------------------------------------------
if exists(select * from sysobjects where name=‘员工表‘ and xtype=‘U‘) drop table 员工表
if exists(select * from sysobjects where name=‘班别表‘ and xtype=‘U‘) drop table 班别表
if exists(select * from sysobjects where name=‘班次表‘ and xtype=‘U‘) drop table 班次表
GO
/*--生成测试用数据,为SELECT初始环境--*/
CREATE TABLE 员工表(员工编号 int,员工姓名 varchar(10))
INSERT INTO 员工表 SELECT 1,‘张三‘
UNION ALL SELECT 2,‘李四‘
CREATE TABLE 班别表(班别编号 int,班别名称 varchar(10))
INSERT INTO 班别表 SELECT 1,‘员工班别‘
UNION ALL SELECT 2,‘保安早班‘
UNION ALL SELECT 3,‘保安中班‘
UNION ALL SELECT 4,‘保安晚班‘
CREATE TABLE 班次表(班别编号 int,班次编号 int,班次名称 varchar(10),时间 varchar(20))
INSERT INTO 班次表 SELECT 1,1,‘上午上班‘,‘08:00‘
UNION ALL SELECT 1,2,‘上午下班‘,‘12:00‘
UNION ALL SELECT 1,3,‘下午下班‘,‘14:00‘
UNION ALL SELECT 1,4,‘下午下班‘,‘18:00‘
UNION ALL SELECT 2,1,‘上班‘,‘08:00‘
UNION ALL SELECT 2,2,‘下班‘,‘16:00‘
UNION ALL SELECT 3,1,‘上班‘,‘16:00‘
UNION ALL SELECT 3,2,‘下班‘,‘00:00‘
UNION ALL SELECT 4,1,‘上班‘,‘00:00‘
UNION ALL SELECT 4,2,‘下班‘,‘08:00‘
CREATE TABLE 考勤登记表(员工编号 int,班别编号 int,班次编号 int,登记日期 smalldatetime,登记时间 varchar(10))
INSERT INTO 考勤登记表 SELECT 1,1,1,‘2006/5/1‘,‘08:00‘
--select * from 员工表
--select * from 班别表
--select * from 班次表
--select * from 考勤登记表
GO
--此处为用来查询的SELECT语句
SELECT
    A.员工编号,
    员工姓名,
    刷卡日期=Convert(varchar(10),登记日期,110),
    上班时间,
    下班时间
FROM
    员工表 A,(
     SELECT
        D.*,上班时间,下班时间     
     FROM
        班别表 B INNER JOIN (
            SELECT
                班别编号=MAX(班别编号),
                上班时间=MAX(CASE RIGHT(班次名称,2) WHEN ‘上班‘ THEN 时间 ELSE NULL END),
                下班时间=MAX(CASE RIGHT(班次名称,2) WHEN ‘下班‘ THEN 时间 ELSE NULL END)
            FROM 班次表
            GROUP BY 班别编号
        ) C ON B.班别编号=C.班别编号
        INNER JOIN 考勤登记表 D ON C.班别编号=D.班别编号
    ) X
WHERE A.员工编号=X.员工编号
GO
--删除测试散数据
DROP TABLE 员工表,班别表,班次表,考勤登记表
/* -- 结果 --
员工编号        员工姓名       刷卡日期       上班时间                 下班时间                
----------- ---------- ---------- -------------------- --------------------
1           张三         05-01-2006 08:00                18:00
*/ -- 完成 --
------------------------------------------------
create table 员工表(员工编号 nvarchar(20),员工姓名 nvarchar(20))
insert 员工表 select ‘1‘,‘张三‘
union all select ‘2‘,‘李四‘
go
create table 班别表(班别编号 nvarchar(20),班别名称 nvarchar(20))
insert 班别表 select ‘1‘,‘员工班别‘
union all select ‘2‘,‘保安早班‘
union all select ‘3‘,‘保安中班‘
union all select ‘4‘ ,‘保安晚班‘
go
drop table 班次表
create table 班次表(班别编号 nvarchar(20),  班次编号  nvarchar(20),  班次名称 nvarchar(20),   时间 nvarchar(20))
insert 班次表 select ‘1‘,         ‘1‘,         ‘上午上班‘,   ‘08:00‘
union all select ‘1‘,         ‘2‘,          ‘上午下班‘,   ‘12:00‘
union all select ‘1‘,         ‘3‘,          ‘下午下班‘,   ‘14:00‘
union all select ‘1‘,         ‘4‘,          ‘下午下班‘,   ‘18:00‘
union all select ‘2‘,         ‘1‘,          ‘上班‘,       ‘08:00‘
union all select ‘2‘,         ‘2‘,          ‘下班‘,       ‘16:00‘
union all select ‘3‘,         ‘1‘,          ‘上班‘,       ‘16:00‘
union all select ‘3‘,         ‘2‘,          ‘下班‘,       ‘00:00‘
union all select ‘4‘,         ‘1‘,          ‘上班‘,       ‘00:00‘
union all select ‘4‘,         ‘2‘,          ‘下班‘,       ‘08:00‘
go
drop table 考勤登记表
create table 考勤登记表(员工编号 nvarchar(20),  班别编号 nvarchar(20),  班次编号 nvarchar(20), 登记日期 datetime ,登记时间 nvarchar(20))
insert 考勤登记表 select ‘1‘,         ‘1‘,          ‘1‘,         ‘2006/5/1‘,  ‘08:00‘
go
/*
要求写一个查询,查出某一个编号的员工一个月内某一个班别的考勤.
比如: 员工1 (可能是保安,保安一个月内的班别是会变化的) 2006年1月保安早班考勤:
员工1 保安早班考勤:
----------------------------------------
登记日期   上班时间   下班时间
*/
select a.员工编号,a.员工姓名,b.登记日期,c.时间 as 上班时间,d.时间 as 下班时间 from 员工表 a  Left join 考勤登记表 b  on a.员工编号=b.员工编号
Left join 班次表 c on b.班别编号=c.班别编号
Left join 班次表 d on b.班别编号=d.班别编号
where c.班次名称 like ‘%上班%‘ and d.班次名称 like ‘%下班%‘
---------------
员工编号                 员工姓名                 登记日期                                                   上班时间                 下班时间                
-------------------- -------------------- ------------------------------------------------------ -------------------- --------------------
1                    张三                   2006-05-01 00:00:00.000                                08:00                12:00
1                    张三                   2006-05-01 00:00:00.000                                08:00                14:00
1                    张三                   2006-05-01 00:00:00.000                                08:00                18:00
(所影响的行数为 3 行)

 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SQLServer数据集合的交、并、差集运算
SqlServer生成交叉表大全
处理表重复记录(查询和删除)_整理贴4
拆分字段SQL语句
SQL语句临时表、表变量注意事项(解决游标性能)
求第一个字符串中第二个串的个数,综合模糊查询
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服