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

MS SQL Server 实战 排查多列之间的值是否重复

 

目录

需求

范例运行环境

数据样本设计

功能实现

上传EXCEL文件到数据库

SQL语句

小结


需求

在日常的应用中,排查列重复记录是经常遇到的一个问题,但某些需求下,需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据,主要包括题目和选项字段(如单选选择项或多选选择项) ,一个合理的数据存储应该保证这些选项列之间不应该出现重复项目数据,比如选项A不应该和选项B的值重复,选项B不应该和选项C的值重复,以此穷举类推,以保证这些选项之间不会出现重复的值。本文将介绍如何利用 group by  、having 语句来实现这一需求,主要实现如下功能:

(1)上传 EXCEL 版试题题库到 MS SQL SERVER 数据库进行导入

(2)通过 union all  将各选项列的数据进行 转记录行的合并

(3)通过 group by 语句 和 count 聚合函数统计重复情况

(4)通过 having 子句筛选出重复记录

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

.netFramework 4.7.2

数据样本设计

假设有 EXCEL 数据题库如下:

如图我们假设设计了错误的数据源,第4题的A选项与D选项重复,第8题的A选项与C选项重复了。

 

题库表 [exams] 设计如下:

序号字段名类型说明备注
1sortidint排序号题号,唯一性
2etypenvarchar试题类型如多选、单选
3etitlenvarchar题目
4Anvarchar选项A
5Bnvarchar选项B
6Cnvarchar选项C
7Dnvarchar选项D

功能实现

上传EXCEL文件到数据库

导入功能请参阅我的文章《C#实现Excel合并单元格数据导入数据集》这里不再赘述。

SQL语句

首先通过 UNION ALL 将A到D的各列的值给组合成记录集 a,代码如下:

	select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  

其次,通过 group by 对 sortid (题号) 和 item (选项) 字段进行分组统计,使用 count 聚合函数统计选项在 题号 中出现的个数,如下封装:

select item,count(item) counts,sortid from (select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  
) a group by sortid,item order by sortid

最后使用 having 语句对结果集进行过滤,排查出问题记录,如下语句:

select item,count(item) counts,sortid from (select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  
) a group by sortid,item   having count(item)>1 order by sortid

在查询分析器运行SQL语句,显示如下图:

由此可以看出,通过查询可以排查出第4题和第8题出现选项重复问题。 

小结

我们可以继续完善对结果的分析,以标注问题序号是哪几个选项之间重复,可通过如下语句实现:


select case when A=item then 'A' else ''end+
case when B=item then 'B' else '' end +
case when C=item then 'C' else '' end +
case when D=item then 'D' else '' end tip
,b.* from  
(select item,count(item) counts,sortid from (select A as item,sortid from exams  union allselect B as item,sortid from exams  union allselect C as item,sortid from exams  union allselect D as item,sortid from exams  
) a group by sortid,item   having count(item)>1 ) b,exams c where b.sortid=c.sortid

关键语句:case when A=item then 'A' else ''end+
case when B=item then 'B' else '' end +
case when C=item then 'C' else '' end +
case when D=item then 'D' else '' end tip

这个用于对比每一个选项列,得到对应的选项列名,运行查询分析器,结果显示如下:

这样我们可以更直观的看到重复的选项列名是哪几个,以更有效帮助我们改正问题。在实际的应用中每一个环节我们都难免会出现一些失误,因此不断的根据实际的发生情况总结经验,通过计算来分析,将问题扼杀在摇篮里,以最大保证限度的保证项目运行效果的质量。

至此关于排查多列之间重复值的问题就介绍到这里,感谢您的阅读,希望本文能够对您有所帮助。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTB-Lame(msf利用)
  • 数学建模笔记—— 多目标规划
  • Xcode报错:No exact matches in reference to static method ‘buildExpression‘
  • 微服务之间远程调用实现思路
  • MySQL练手题--体育馆的人流量(困难)
  • PyCharm安装
  • Jacoco的XML报告详解
  • Uniapp + Vue3 + Vite +Uview + Pinia 实现购物车功能(最新附源码保姆级)
  • Flask 第八课 -- 模板渲染
  • ArrayList 源码解析
  • Python快速入门 —— 第三节:类与对象
  • 手机玩机常识____展讯芯片刷机平台ResearchDownload的一些基本常识与问题解决
  • 【网络安全的神秘世界】渗透测试基础
  • 3. Python计算水仙花数
  • 2848. 与车相交的点(24.9.19)
  • 【RocksDB】TransactionDB源码分析
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • github从入门到放弃(1)
  • Java读取Properties文件的六种方法
  • js算法-归并排序(merge_sort)
  • JS题目及答案整理
  • log4j2输出到kafka
  • PHP 的 SAPI 是个什么东西
  • Python - 闭包Closure
  • Python十分钟制作属于你自己的个性logo
  • SQLServer之索引简介
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 从零开始在ubuntu上搭建node开发环境
  • 基于游标的分页接口实现
  • 浏览器缓存机制分析
  • 模型微调
  • 算法---两个栈实现一个队列
  • 微信开放平台全网发布【失败】的几点排查方法
  • 译有关态射的一切
  • 你对linux中grep命令知道多少?
  • AI算硅基生命吗,为什么?
  • ​批处理文件中的errorlevel用法
  • ​香农与信息论三大定律
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (void) (_x == _y)的作用
  • (八)Flink Join 连接
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (算法)求1到1亿间的质数或素数
  • (一)Docker基本介绍
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .apk文件,IIS不支持下载解决
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET中使用Redis (二)