news 2026/10/15 20:39:13

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MS SQL Server 实战 统计与汇总重复记录

目录

需求

范例运行环境

数据样本设计

功能实现

上传EXCEL文件到数据库

分组统计 SQL 语句

分组汇总 SQL 语句

having 语句过滤最终统计结果

小结


需求

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

题库表 [exams] 设计如下:

序号

字段名

类型

说明

备注

1

sortid

int

排序号

题号,唯一性

2

etype

nvarchar

试题类型

如多选、单选

3

title

nvarchar

题目

4

A

nvarchar

选项A

5

B

nvarchar

选项B

6

C

nvarchar

选项C

7

D

nvarchar

选项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

运行结果如下图:

分组汇总 SQL 语句

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

SELECT title,etype,count(title) ct,min(sortid) s1,max(sortid) s2 FROM [exams] group by etype,Title with ROLLUP

运行结果如下图:

如图可以看到统计中会加入汇总的记录行,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语句,显示如下图:

如图可以看出,统计汇总结果清晰的反映出了重复记录的情况,即 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

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

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

更多详情请参考如下链接:

https://learn.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms177673(v=sql.105)?redirectedfrom=MSDN

https://learn.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/ms180199(v=sql.105)

至此关于统计汇总重复记录的问题就介绍到这里,感谢您的阅读,希望本文能够对您有所帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 13:45:04

LeetCode 172. Factorial Trailing Zeroes 题解

题目概述 LeetCode 172. Factorial Trailing Zeroes:给定一个整数 n,返回 n! 中尾随零(结尾连续的 0)的个数。leetcode​ 注意: n! n (n − 1) … 2 10 ≤ n ≤ 10^4Follow up:是否可以在对数时间复…

作者头像 李华
网站建设 2026/10/10 22:18:07

AWS OpenSearch Service TLS 策略升级指南

📋 概述 AWS OpenSearch Service 将于 2026 年 4 月 20 日停止支持 TLS 1.0 和 1.1 版本。本文详细介绍如何安全地将 OpenSearch 域的 TLS 策略升级到 TLS 1.2,确保服务的持续可用性和安全性。 🚨 重要通知 截止日期: 2026 年 4 月 20 日 影响: 使用 TLS 1.0/1.1 的域将…

作者头像 李华
网站建设 2026/10/14 19:23:59

深度学习毕设项目:基于人工智能深度学习的土豆疾病识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/10/13 9:23:44

Spring Boot Admin与Kubernetes集成监控

摘要 本文深入探讨Spring Boot Admin与Kubernetes的集成监控方案,包括容器化部署、服务发现、资源监控等关键技术点。通过详细的技术解析和实践示例,帮助开发者构建基于Kubernetes的微服务监控体系。 1. 引言 Kubernetes作为容器编排的标准,与…

作者头像 李华
网站建设 2026/10/10 22:22:22

强烈安利!专科生毕业论文必备TOP9 AI论文平台

强烈安利!专科生毕业论文必备TOP9 AI论文平台 2026年专科生论文写作工具测评:为什么你需要这份榜单? 随着AI技术在学术领域的深入应用,越来越多的专科生开始借助智能工具提升论文写作效率。然而面对市场上琳琅满目的AI论文平台&am…

作者头像 李华
网站建设 2026/10/15 14:07:40

【毕业设计】机器学习 基于python-cnn深度学习的罗马数据集训练识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华