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

云掣YunChe1年前技术文章1124

需求

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

前言今天遇到了一个报错,觉得挺有意思的,在此记录下。SELECT command denied to user 'xxx'@'xxx' for table 'xxx'1. 报错原因这里是研发提了一条修...

EM部署HBASE

EM部署HBASE

先获取HBASE包,放在em节点中,在HBASE包所在的服务器上执行,127.0.0.1指向的是em服务器的ip。# {package_name}表示为具体的tar包名称 curl http://1...

impala故障处理

问题复现:[cdh004:21000] > select count(*) from impala_100yi; Query: select count(*) from impala_100y...

Kubernetes 认证授权

Kubernetes 认证授权

1、认证所有 Kubernetes 集群都有两类用户:由 Kubernetes 管理的服务账号和普通用户。任何客户端访问之前,经由 kubernetes 时,需经过:认证(token, ssl)、授权...

某客户ERP华为云502错误案例

某客户ERP华为云502错误案例

1、客户反馈系统出现502错误图1上面的截图,我们大致可以看到浏览器显示的502错误,但是我们还有获知更多的信息。通过沟通我们可以确定:此功能为新上线功能,上线后一直是访问502,但是开发又找不到相关...

Redis 内存使用情况查看

内存情况查看1、MEMORY STATS--连接 redisredis-cli--执行 MEMORY STATS命令查询内存使用详情 MEMORY STATSRedis实例的内存开销主要由两部分组成:...

发表评论    

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