Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MS SQL Server 实战 统计与汇总重复记录

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

作者头像
初九之潜龙勿用
发布于 2024-10-09 06:26:54
发布于 2024-10-09 06:26:54
17700
代码可运行
举报
文章被收录于专栏:技术文章技术文章
运行总次数:0
代码可运行

需求

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	SELECT title,etype,count(title) ct,min(sortid) s1,max(sortid) s2

	  FROM [exams]  
	  
	  group by etype,Title

运行结果如下图:

分组汇总 SQL 语句

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	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 条件语句,写法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	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 题。

小结

我们可以继续完善对结果的分析,以标注汇总行的提示信息,可通过如下语句实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MS SQL Server 实战 排查多列之间的值是否重复
在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据,主要包括题目和选项字段(如单选选择项或多选选择项) ,一个合理的数据存储应该保证这些选项列之间不应该出现重复项目数据,比如选项A不应该和选项B的值重复,选项B不应该和选项C的值重复,以此穷举类推,以保证这些选项之间不会出现重复的值。本文将介绍如何利用 group by 、having 语句来实现这一需求,主要实现如下功能:
初九之潜龙勿用
2024/09/17
3720
MS SQL Server 实战 排查多列之间的值是否重复
MS SQL Server STUFF 函数实战 统计记录行转为列显示
假设某一视图 [v_pj_rep1_lname_score] 可查询对某一被评价人的绩效指标的打分情况,并按评价人的职务进行分类, 设计如下:
初九之潜龙勿用
2024/06/20
2050
MS SQL Server STUFF 函数实战 统计记录行转为列显示
MS SQL Server partition by 函数实战 统计与输出
假设有一课程项目,我们需要统计该项目中的课件数量,并提取课程信息,如课程标题名称、排序号等,如果使用 GROUP BY 聚合函数,则只能统计返回课件项目及对应的课件数量一条记录,无法显示明细信息,对于终端想要进行输出的话,此时 partition by 就派上用场了。
初九之潜龙勿用
2024/06/20
1360
MS SQL Server partition by 函数实战 统计与输出
SQL Server 2008中增强的汇总技巧
SQL Server 2008中对汇总有明显的增强,有点像Oracle的语法了。请看下面五个例子:
跟着阿笨一起玩NET
2018/09/19
1.2K0
SQL Server 2008中增强的汇总技巧
sql删除重复记录
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
王念博客
2019/07/24
2.3K0
​LeetCode刷题实战466:统计重复个数
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/12/15
6790
SQL Server T-SQL高级查询
高级查询在数据库中用得是最频繁的,也是应用最广泛的。 Ø 基本常用查询 --select select * from student;   --all 查询所有 select all sex from student;   --distinct 过滤重复 select distinct sex from student;   --count 统计 select count(*) from student; select count(sex) from student; select count(distin
磊哥
2018/04/26
4K0
MS SQL Server partition by 函数实战二 编排考场人员
假设有若干已分配准考证号的考生,准考证号示例(01010001)共计8位,前4位为分类号,后4位为分类下的总排序号。现提供考场分配信息EXCEL文件(包括考场编号 、考场名称、考场容纳人数等),希望根据准考证号升序,将考生分配于对应的考场中,并生成对应的座位号(也即每一个考场的排序号),即分配原则为准考证号越小,考场号和座位号越靠前 。本文将继续介绍利用 partition by 、c# 来实现这一需求,主要实现如下功能:
初九之潜龙勿用
2024/09/05
1600
MS SQL Server partition by 函数实战二 编排考场人员
答题小程序学习,题库答题类小程序,云开发+cms做后台,有错题集,积分排名,做题进度
今天开始手把手的带大家实现一款答题类的小程序,如果着急的话,可以直接去看最后一章源码下载与项目部署
编程小石头
2021/11/30
1.9K0
答题小程序学习,题库答题类小程序,云开发+cms做后台,有错题集,积分排名,做题进度
SQL语句面试题目_sql基础知识面试题
表结构,节选自:http://www.cnblogs.com/qixuejia/p/3637735.html 题目一,节选,自:https://wenku.baidu.com/view/cda288f1b90d6c85ed3ac671.html 题目二,节选,自:http://www.cnblogs.com/qixuejia/p/3637735.html (为了满足“题目”查询条件,在原文的基础上,插入的测试语句中”增加了几条sc,新增了条Course,修改了student的部分年龄)
全栈程序员站长
2022/09/27
9160
php实现在线考试系统【附源码】
说明:本篇文章是为了记录下学习开发思路,程序不具备商业价值,明白开发思路,商用需二次升级!
子润先生
2021/07/13
3.5K0
4.表记录的更新操作
例如: insert…select插⼊结果集 注意:字段列表1与字段列表2的字段个数必须相同,且对应字段的数据类型尽量保持⼀致。例如:
卡伊德
2022/09/13
1.2K0
SQL Server 每日一题--重复报名的人解析
这个题目主要考察的是 group by 和 having 语句的使用,找重复数据,首先使用 group by 进行汇总,然后使用 having 进行过滤,使用Count(字段) 进行统计汇总数据,大于1的则为重复。
喵叔
2020/09/08
2700
MS SQL Server partition by 函数实战三 成绩排名
假设有若干已更新考试成绩的考生,考试成绩包括总成绩、分项成绩1、分项成绩2,其它信息包括应聘岗位名称、姓名等信息。现希望根据总成绩计算排名,成绩越高排名越靠前,相同成绩排名并列,另外有并列则按总数递增,如两个第1后是第3。本文将继续介绍利用 partition by 来实现这一需求,主要实现如下功能:
初九之潜龙勿用
2024/09/09
1320
MS SQL Server partition by 函数实战三 成绩排名
统计一个数据库中,无记录的表的sql语句
SQL Server数据库中统计无记录数的表 大家使用的时候,将sql脚本中的红色[TestDB] 换成你的目标数据库名称。 1 /********************************
张传宁IT讲堂
2019/09/17
1.4K0
统计一个数据库中,无记录的表的sql语句
sql DISTINCT去掉重复的数据统计方法
sql DISTINCT去掉重复的数据统计方法(2009-01-13 15:05:43)转载 标签:sqldistinct杂谈 分类:sql
零式的天空
2022/03/21
2.9K0
图解面试题:人均付费如何分析?
2.表一中各地市ARPU(0,30),[30,50),[50-80),[80以上)用户数分别是多少?
猴子聊数据分析
2020/07/21
9650
好的数据库面试题集合
http://blog.csdn.net/sandyzhs/article/details/4059709
bear_fish
2018/09/20
1.8K0
数据库(MySQL)相关例题27道及答案解析
一、单选题 (共计 18题) 1、(单选题)SQL语句分为DDL、DML、DQL、TCL、DCL,以下属于DML的是_______,是否_______事务。 A.drop 不支持 B.insert 支持 C.alter 支持 D.select 不支持 【正确答案】B 【答案解析】
海拥
2021/08/23
5.6K0
SQL Server优化
  1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.
挽风
2021/04/13
1.8K0
推荐阅读
相关推荐
MS SQL Server 实战 排查多列之间的值是否重复
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验