首页 > 数据库 >SQL练习之打卡记录数据统计类问题

SQL练习之打卡记录数据统计类问题

时间:2024-05-09 20:34:37浏览次数:26  
标签:00 12 SQL fx67ll 练习 2024 user 2023 打卡

最近老婆的公司,关闭了OA系统中,各类打卡时间数据统计的功能,为了不麻烦老婆手算,就做了一个简单的打卡系统,方便自动统计老婆想要知道的各类数据。

做的过程中就遇到了几个还挺有意思的SQL,这里写成一篇博文,方便后期练习~

Tip:需要答案的盆友可以访问 参考答案的链接,密码是123456~

建表语句

drop table if exists fx67ll_punch_log;
create table fx67ll_punch_log (
  punch_id             bigint(20)      not null auto_increment    comment '打卡记录主键',
  punch_type           char(1)                                    comment '打卡类型(1代表上班 2代表下班)',
  punch_remark         varchar(1023)   default ''                 comment '打卡记录备注',
  del_flag             char(1)         default '0'                comment '删除标志(0代表存在 2代表删除)',
  user_id              bigint(20)                                 comment '用户ID',
  create_by            varchar(64)     default ''                 comment '记录创建者',
  create_time 	       datetime                                   comment '记录创建时间',
  update_by            varchar(64)     default ''                 comment '记录更新者',
  update_time          datetime                                   comment '记录更新时间',
  primary key (punch_id)
) engine=innodb auto_increment=1 comment = '打卡记录表';

插入测试数据

INSERT INTO `ruoyi-mysql`.fx67ll_punch_log (punch_type,punch_remark,del_flag,user_id,create_by,create_time,update_by,update_time) VALUES
	 ('1','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-06 00:00:00'),
	 ('2','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-06 21:00:00'),
	 ('1','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-08 15:00:00'),
	 ('2','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-08 18:19:00'),
	 ('2','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-08 21:00:00'),
	 ('1','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-10 20:50:00'),
	 ('2','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-10 21:44:00'),
	 ('2','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-10 22:50:00'),
	 ('1','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-11 10:00:00'),
	 ('2','','0',1,'fx67ll','2023-12-12 19:49:41','fx67ll','2023-12-11 20:00:00'),
	 ('1','','0',101,'user','2023-12-13 17:03:22','user','2023-12-13 00:06:00'),
	 ('2','e e e','0',101,'user','2023-12-13 17:03:14','user','2023-12-11 01:01:00'),
	 ('1','123','0',1,'fx67ll','2023-12-14 09:53:54','fx67ll','2023-12-14 09:53:50'),
	 ('2','','0',101,'user','2024-03-13 17:49:16','user','2024-03-13 17:49:00'),
	 ('1','324','0',101,'user','2024-03-21 11:22:16','user','2024-03-21 11:22:17'),
	 ('2','','0',101,'user','2024-03-21 11:22:43','user','2024-03-21 22:22:39'),
	 ('2','','0',1,'fx67ll','2024-03-30 20:01:10','fx67ll','2024-03-30 20:01:00'),
	 ('1','','0',1,'fx67ll','2024-04-30 15:01:16','fx67ll','2024-04-30 00:01:06'),
	 ('2','','0',1,'fx67ll','2024-04-30 15:01:25','fx67ll','2024-04-30 23:01:16'),
	 ('1','','0',1,'fx67ll','2024-04-30 15:01:31','fx67ll','2024-04-24 15:01:25'),
	 ('1','','0',101,'user','2024-05-03 02:39:33','user','2024-05-03 02:39:29'),
	 ('1','','0',101,'user','2024-05-03 02:39:41','user','2024-05-04 00:39:33'),
	 ('2','123','0',101,'user','2024-05-03 02:39:52','user','2024-05-04 23:39:41');

问题一:统计每个用户每个月的工作总时长、总打卡天数、有效打卡天数以及日均工时

需要得到如下的统计数据,每个字段的含义分别是:

  1. punch_user:打卡的用户
  2. punch_month:本条记录统计的打卡月份
  3. total_work_hours:当月的工作总时长,小时为单位
  4. total_work_minutes:当月的工作总时长,分钟为单位
  5. total_work_seconds:当月的工作总时长,秒为单位
  6. total_punch_days:当月的总打卡天数,只要有打卡记录就算,可能只打了上班卡,或者只打了下班卡,但是,没有打卡记录的天数则不算
  7. total_work_days:当月的有效打卡天数,必须满足条件,既有上班打卡记录,又有下班打卡记录,才算一个有效打卡天数
  8. work_hours_per_day:当月的日均工时,小时为单位
punch_user|punch_month|total_work_hours|total_work_minutes|total_work_seconds|total_punch_days|total_work_days|work_hours_per_day|
----------+-----------+----------------+------------------+------------------+----------------+---------------+------------------+
fx67ll    |2023-12    |         39.0000|              2340|            140400|               5|              4|        9.75000000|
fx67ll    |2024-03    |                |                  |                  |               1|              0|                  |
fx67ll    |2024-04    |         23.0028|              1380|             82810|               2|              1|       23.00277778|
user      |2023-12    |                |                  |                  |               2|              0|                  |
user      |2024-03    |         11.0061|               660|             39622|               2|              1|       11.00611111|
user      |2024-05    |         23.0022|              1380|             82808|               2|              1|       23.00222222|

问题二:统计每个用户当月的只打了一次卡的缺卡记录

需要得到如下的统计数据,每个字段的含义分别是:

  1. punch_user:缺卡的用户
  2. punch_month:本条记录的缺卡月份
  3. punch_day:本条记录的缺卡日期
  4. lost_punch_type:本条记录的缺卡类型,需要输出是上班缺卡还是下班缺卡
punch_user|punch_month|punch_day |lost_punch_type|
----------+-----------+----------+---------------+
fx67ll    |2023-12    |2023-12-14|下班缺卡           |
fx67ll    |2024-03    |2024-03-30|上班缺卡           |
fx67ll    |2024-04    |2024-04-24|下班缺卡           |
user      |2023-12    |2023-12-11|上班缺卡           |
user      |2023-12    |2023-12-13|下班缺卡           |
user      |2024-03    |2024-03-13|上班缺卡           |
user      |2024-05    |2024-05-03|下班缺卡           |

我是 fx67ll.com,如果您发现本文有什么错误,欢迎在评论区讨论指正,感谢您的阅读!
如果您喜欢这篇文章,欢迎访问我的 本文github仓库地址,为我点一颗Star,Thanks~

标签:00,12,SQL,fx67ll,练习,2024,user,2023,打卡
From: https://www.cnblogs.com/fx67ll/p/18183022/sql-practice-punch

相关文章

  • MySQL 创建数据库使用 UTF-8 问题
    问题描述将emoji符号(如......
  • mysql - mysql 命令行的使用
    1.Mysql管理连接数据库--连接本地数据库mysql-uroot-p--连接远程数据库mysql-h192.168.0.105-uroot-p--连接远程指定数据库并设置字符集mysql-h192.168.0.105-uroot-p--default-character-set=utf8test修改root密码,直接修改配置文件[mysql]......
  • SQL——连续出现的数字
    SQL三个排序函数ROW_NUMBER()、RANK()、DENSE_RANK()ROW_NUMBER()不并列连续的RANK()分组不连续排序(跳跃排序)DENSE_RANK()并列连续创建实例表:点击查看代码DROPtableIFEXISTScon;CreateTableIFNOTEXISTScon(idint,Numint);INSERTINTOconVALUES(1,1);INS......
  • 【转】[MySQL] 忘记密码的处理之 Windows 篇
    来自:阿里的通义灵码在Windows环境下,如果你忘记了MySQL的root密码,可以通过以下步骤重置:停止MySQL服务:打开“服务”管理工具(可以通过运行 services.msc 或搜索“服务”找到)。找到名为 MySQL 或 MySQL80(根据你的版本)的服务,然后右键选择“停止”。找到MySQ......
  • 【转】[MySQL] 忘记密码的处理之 Linux 篇
    来自:阿里的通义灵码如果你忘记了MySQL的root用户密码,可以按照以下步骤重置:方法1:使用 mysqld_safe 跳过授权表停止MySQL服务:bash sudoservicemysqlstop启动MySQL并跳过授权表:bash sudomysqld_safe--skip-grant-tables&登录到MyS......
  • mysql8.0数据库添加用户和授权
    MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作1.创建新用户createuser'username'@'host'identifiedby'password';其中username为自定义的用户名;host为登录域名,host为'%'时表示为任意IP,为localhost时表示本机,或者填写指......
  • SqlFunc查询函数
    一、常用的C#函数支持一些常用的C#函数.ToString().Contains().Length().ToLower().ToUpper().ToSubstring().Equals().Replace().EndsWith().StartsWith().Trim().HasValue.Value.AddDays(AddHours等)和常用的Convert.ToInt32等三元xx??0时......
  • Python 如何优雅的操作 PyMySQL
    一、PyMysql在使用Python操作MySQL数据过的过程中,基本的增删改查操作如何更加高效优雅的执行。这里将以PyMySQL为例,介绍一下如何使用Python操作数据库。Python对MySQL数据库进行操作,基本思路是先连接数据库Connection对象,建立游标Cursor对象,然后执行SQL语句对数据库进行操作......
  • mysql多表查询
    1.多表查询  项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)多对多一对一2.分类连接查询内连接:相当于查询A、B交集部分数据外......
  • SQL查询语句执行顺序
    SQL语句定义顺序SELECTDISTINCT<select_list>FROM<left_table><join_type>JOIN<right_table>ON<join_condition>WHERE<where_condition>GROUPBY<group_by_list>HAVING<having_condition>ORDERBY<order_by_c......