当前位置: 首页 > news >正文

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)

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

http://www.jsqmd.com/news/212123/

相关文章:

  • 一、CS反恐精英AMXX插件安装(附带安装包)
  • maven导入spring框架
  • 深度学习毕设项目:基于python-CNN的水果识别
  • maxun爬虫机器人介绍与部署
  • Java进阶-SpringCloud设计模式-工厂模式的设计与详解
  • Thinkphp和Laravel框架的高校教室报修管理系统_14oaj0v7
  • 快速查看电脑开机时间
  • JDK17在Windows安装以及环境变量配置(超详细的教程)
  • Python+flask的高校餐饮档口管理系统的设计与实现_6t8pw5bl-Pycharm vue django项目源码
  • Thinkphp和Laravel框架的成都某民宿预订系统的设计与实现_r93v34dv
  • MS SQL Server partition by 函数实战三 成绩排名
  • Thinkphp和Laravel框架的电信学院年终高校考核材料归档平台研究与设计_80664x25
  • Java进阶-在Ubuntu上部署SpringBoot应用
  • Spring Boot Admin与Kubernetes集成监控
  • 【Unity】实现Quad瓦片(MeshRenderer)渲染图集图片
  • 【课程设计/毕业设计】基于python-CNN深度学习的水果识别
  • MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序
  • Thinkphp和Laravel框架的茶叶购物网上商城系统 潇湘知茶小程序_dyo5sig5
  • 【状态估计】基于LQR控制和卡尔曼滤波算法实现二维四旋翼的状态估计(噪声传感器数据)附Matlab代码
  • 【毕业设计】基于深度学习python-CNN的水果识别
  • 2026免费好用的AIPPT工具榜:智能演示文稿制作新纪元
  • Thinkphp和Laravel框架的蛋糕甜品烘焙教程微信小程序设计与实现_6uy1k94r
  • Java进阶07 嵌套类
  • 计算机深度学习毕设实战-卷神经网络基于深度学习的土豆疾病识别
  • 【毕业设计】机器学习 基于python-cnn深度学习的罗马数据集训练识别
  • Knife4j文档请求异常(基于SpringBoot3,查找原因并解决)
  • 从执行到管理:SOP思维,是你必须掌握的职场杠杆
  • Kafka 基础概念
  • 【毕业设计】机器学习基于python深度学习的苹果和西红柿识别
  • knife4j+springboot3.4异常无法正确展示文档