需求
在日常的数据管理应用中,统计和汇总重复记录的情况是经常遇到的一个问题,然后我们会根据统计结果进一步对数据进行合理化处理。比如我们有一组题库数据,主要包括题目和选项字段(如单选题目、多选题目和判断题目),一个合理的数据存储应该至少保证这些题目在分类中不应该出现重复题目标题数据。本文将介绍如何利用 group by、with rollup、having 语句来实现这一统计汇总需求,主要实现如下功能:
- 上传 EXCEL 版试题题库到 MS SQL SERVER 数据库进行导入
- 通过 group by 语句统计记录个数
- 通过 group by 语句和 with rollup 统计和汇总重复情况
- 通过 having 子句进一步筛选出统计情况
范例运行环境
操作系统:Windows Server 2019 DataCenter 数据库:Microsoft SQL Server 2016 .net Framework 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# 代码实现,具体细节请参考相关技术文档,本文重点讨论 SQL 统计逻辑。
分组统计 SQL 语句
首先通过 group by 按试题类型和题目进行分组统计,并使用 count、min、max 聚合函数统计题目重复的个数,出现的最小排序号和最大排序号,代码如下:
SELECT title, etype, count(title) ct, min(sortid) s1, max(sortid) s2 FROM [exams] group etype, Title






