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

云掣YunChe10个月前技术文章683

需求

在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统计结果进一步对数据进行合理化处理。比如我们有一组题库数据,主要包括题目和选项字段(如单选题目、多选题目和判断题目) ,一个合理的数据存储应该至少保证这些题目在分类中不应该出现重复题目标题数据。本文将介绍如何利用 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 值的表示总数的统计行。



相关文章

ubuntu20.04服务器安全策略设定

ubuntu20.04服务器安全策略设定

密码策略1、经核查,服务器用户身份标识唯一,口令存储在服务器中采用SHA512算法,服务器配置口令复杂度,口令要求8位以上,字母、数字、特殊字符组成,口令180天定期更换。# SHA512算法查看ca...

CDH实操--kudumaster迁移

CDH实操--kudumaster迁移

1 概述本次kudumaster迁移,中间不需要停kudu集群(会涉及滚动重启kudu角色); 注:若因为任务持续运行导致kudu停止超时可手动一台台停止-启动2 master迁移将cdh2中的ma...

PostgreSQL 流复制

前言PostgreSQL 流复制(Streaming Replication)是 9.0 提供的一种新的 WAL 传递方法。使用流复制时,每当 Primary 节点 WAL 产生,就会马上传递到 St...

mysql插入之前先测试环境试试

在生产环境中直接执行数据库操作可能会引起一系列问题,比如性能下降、数据不一致甚至系统崩溃。因此,在实际操作前在测试环境中进行彻底的测试非常重要。测试环境准备:确保测试环境与生产环境尽可能一致。这包括硬...

kafka常见配置参数解析

broker.idbroker 的全局唯一编号,不能重复,只能是数字num.network.threads=3处理网络请求的线程数量num.io.threads=8用来处理磁盘 IO 的线程数量soc...

Clickhouse冷热数据分离实践

配置多卷存储策略使用Clickhouse的存储策略功能,可以实现冷热数据分离存储。我们可以将业务上访问频繁的数据放到热存储区(如高性能SSD磁盘),将业务上较少访问的数据放在冷存储区(如价格更便宜、空...

发表评论    

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