MS SQL Server 实战 统计与汇总重复记录

云掣YunChe7个月前技术文章449

需求

在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统计结果进一步对数据进行合理化处理。比如我们有一组题库数据,主要包括题目和选项字段(如单选题目、多选题目和判断题目) ,一个合理的数据存储应该至少保证这些题目在分类中不应该出现重复题目标题数据。本文将介绍如何利用 group by 、with rollup 、having 语句来实现这一统计汇总需求,主要实现如下功能:


(1)上传 EXCEL 版试题题库到 MS SQL SERVER 数据库进行导入


(2)通过 group by 语句统计记录个数


(3)通过 group by 语句 和 with rollup 统计和汇总重复情况


(4)通过 having 子句进一步筛选出统计情况


范例运行环境

操作系统: Windows Server 2019 DataCenter


数据库:Microsoft SQL Server 2016


.netFramework 4.7.2


数据样本设计

假设有 EXCEL 数据题库,如图我们假设设计了错误的数据源,排序号为第207题至212题的题目列为重复值。


4a1f8c227332159372646ace6ec6afeb.png 


题库表 [exams] 设计如下:


序号

字段名类型
说明备注
1
sortid
int
排序号题号,唯一性
2etypenvarchar试题类型如多选、单选
3titlenvarchar题目
4Anvarchar选项A

5Bnvarchar选项B
6Cnvarchar选项C
7Dnvarchar选项D

功能实现

上传EXCEL文件到数据库

导入功能请参阅我的文章《C#实现Excel合并单元格数据导入数据集》这里不再赘述。


分组统计 SQL 语句

首先通过 group by  按试题类型和题目进行分组统计,并使用 count、min、max 聚合函数统计题目重复的个数,出现的最小排序号和最大排序号,代码如下:


SELECT title,etype,count(title) ct,min(sortid) s1,max(sortid) s2

 

  FROM [exams]  

  

  group by etype,Title

运行结果如下图:

713152794e867cca6c913d5cf2479921.png


分组汇总 SQL 语句

使用 with ROLLUP 语句选项,如下语句:


SELECT title,etype,count(title) ct,min(sortid) s1,max(sortid) s2

 

  FROM [exams] 

  

  group by etype,Title with ROLLUP 

运行结果如下图:

5f5603aa8f31d9abc16e767ddce029c0.png



如图可以看到统计中会加入汇总的记录行,NULL值,比如其中判断题共有293题,一共统计总数为654题。 


having 语句过滤最终统计结果

前面的语句起到了统计每一个题目的和每一种题型的统计和汇总作用,我们需要对结果集进一步过滤,就需要使用 having 条件语句,写法如下:


SELECT title,etype,count(title) ct,min(sortid) s1,max(sortid) s2

 

  FROM [exams] 

  

  group by etype,Title with ROLLUP 

  having count(title)>1

在查询分析器运行SQL语句,显示如下图:

5002f655482033d8e72b98131dda6d5b.png



如图可以看出,统计汇总结果清晰的反映出了重复记录的情况,即 count(title)>1 的 ct 字段值,值大于1 的表示该题目出现的个数。另外命令结果增加了4个行,包括单选题统计共 248 题,多选题统计共 113 题,判断题统计共 293 题,总数统计共 654 题。 


小结

我们可以继续完善对结果的分析,以标注汇总行的提示信息,可通过如下语句实现:


SELECT case when title is null then isnull(etype,'总数')+'统计情况:' else title end title

  ,etype,count(title) ct,min(sortid) s1,max(sortid) s2

 

  FROM [exams] 

  

  group by etype,Title with ROLLUP 

  having count(title)>1

运行查询分析器,结果显示如下:

5825596c53813114c7a55b94fbb65039.png


主要是通过 case when 语句对 title 字段进行判断 ,为NULL值的表示汇总行,则进行 isnull(etype,'总数')+'统计情况:' 的字符串拼接,etype字段为 NULL 值的表示总数的统计行。



相关文章

MySQL主从部署(同步+半同步)

一、环境规划1.1服务器规划服务器 IP 版本 配置 Mysql 端口 角色172-16-104-8 172.16.104.8 CentOS release 6.8 (Final) 4c8g 5.7....

MySQL优化器特性(八)索引范围扫描成本计算

MySQL优化器特性(八)索引范围扫描成本计算

range执行计划中的range表示索引范围扫描。索引范围扫描的执行过程大致如下:1、根据where条件中索引字段的条件,定位到索引结构中的第一条满足条件的记录。2、根据索引中记录的rowid,到表中...

MySQL运维实战(6)用户认证插件caching_sha2_password

MySQL用户认证可以使用几种不同的方式,创建用户时可以制定认证方式:create user 'username'@'%' identif...

trino容器对接ldap(二)

trino容器对接ldap(二)

前提:本文前提是在trino容器已经对接上hive组件,并且ldap已经部署完成的基础上进行的对接。前提文章见:helm安装部署trino对接hive(一)安装部署1、设置证书因为不确定是在哪台机器中...

MySQL运维实战之Clone插件(10.2)Clone插件原理

MySQL运维实战之Clone插件(10.2)Clone插件原理

clone插件实现clone操作主要分为几个阶段:1、初始阶段。初始阶段,会开启页面跟踪(Page Tracking)。开启页面跟踪后,修改过的页面的编号会被记录下来。页面的修改可分为两个阶段:首先在...

JMS 介绍

JMS 介绍

一、JMS的基础JMS是什么:JMS是Java提供的一套技术规范JMS干什么用:用来异构系统 集成通信,缓解系统瓶颈,提高系统的伸缩性增强系统用户体验,使得系统模块化和组件化变得可行并更加灵活通过什么...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。