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

云掣YunChe6个月前技术文章383

需求

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



相关文章

Elasticsearch8.5及Kibana8.5安装部署

Elasticsearch8.5及Kibana8.5安装部署

一、环境准备1、Centos7系统2、切换英文系统[root@master02 ~]# tail -n2 /etc/profile export LANG="en_US.UTF-8"3、下载、安...

分布式存储-GlusterFS

分布式存储-GlusterFS

一、分布式存储介绍我们知道NAS是远程通过网络共享目录, SAN是远程通过网络共享块设备。那么分布式存储你可以看作拥有多台存储服务器连接起来的存储输出端。把这多台存储服务器的存储合起来做成一个整体再通...

PostgreSQL 流复制

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

Linux高并发系统内核优化

1)timewait的数量,默认是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值减小)net.ipv4.tcp_max_tw_buckets...

flink应用场景分析

•       Flink适合场景:•       实时数据流处理,对实时的海量...

sqlserver收缩事务日志失败

sqlserver收缩事务日志失败

一、背景2022.01.12 日晚上,sqlserver实例空间使用率达到85%开始告警。查看发现目前日志空间有较大增长,如下图所示:与客户方进行反馈,在1月13日中午进行事务日志的收缩操作,发现日志...

发表评论    

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