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

云掣YunChe12个月前技术文章948

需求

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



相关文章

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

引言        Dockerfile 是构建 Docker 镜像的核心文件。它定义了如何将应用程序及其依赖打包成一个可以跨平台运行的容器。本篇博客将从基础概...

python-序列化和反序列化

1、为什么要序列化内存中的字典、列表、集合以及各种对象,如何保存到一个文件中?如果是自己定义的类的实例,如何保存到一个文件中?如何从文件中读取数据,并让它们在内存中再次恢复成自己对应的类的实例?要设计...

理解YAML文件

YAML 基础它的基本语法规则如下:大小写敏感使用缩进表示层级关系缩进时不允许使用Tab键,只允许使用空格。缩进的空格数目不重要,只要相同层级的元素左侧对齐即可# 表示注释,从这个字符一直到行尾,都会...

Flume使用案例之Flume与Flume之间数据传递(单Flume多Channel、Sink)

目标:使用flume1监控文件变动,flume1将变动内容传递给flume-2,flume-2负责存储到HDFS。同时flume1将变动内容传递给flume-3,flume-3负责输出到local分步...

CDH实操--HDFS高可用设置

CDH实操--HDFS高可用设置

1 概述        在HDFS集群中NameNode存在单点故障(SPOF),对于只有一个NameNode的集群,如果NameNode机...

SparkStreaming对接kafka消费模式区别

SparkStreaming对接kafka消费模式区别

Sparkstreaming对接kafka使用的消费方式与常规的kafka消费方式完全不同,其中区别主要为消费者的管理方式不同。Ø  常规消费模式Kafka常规的消费模式以消费者组为消费单元...

发表评论    

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