MS SQL Server partition by 函数实战二 编排考场人员

news2024/9/19 22:11:05

 

目录

需求

输出效果

范例运行环境

表及视图样本设计

功能实现

生成考场数据

生成重复的SQL语句

封装为统计视图

编写存储过程实现统计

小结


需求

假设有若干已分配准考证号的考生,准考证号示例(01010001)共计8位,前4位为分类号,后4位为分类下的总排序号。现提供考场分配信息EXCEL文件(包括考场编号 、考场名称、考场容纳人数等),希望根据准考证号升序,将考生分配于对应的考场中,并生成对应的座位号(也即每一个考场的排序号),即分配原则为准考证号越小,考场号和座位号越靠前 。本文将继续介绍利用 partition by 、c# 来实现这一需求,主要实现如下功能:

(1)上传考场分布信息的EXCEL,导入生成考场信息数据。

(2)使用 C#  生成重复的SQL语句进行 union all 合并,生成考场座位信息。

(3)将准考证号信息左连接考场座位信息,生成考生分配明细表(包装为视图)。

(4)生成每个考场的准考证号以分类号(前4位)分组统计最小号和最大号范围。

输出效果

实现的考生准考证号分配表如下图:

如图,第1考场可容纳30人,座位号分配则从 1 到 30。分类为0101的准考证号在分配不开的情况下继续分配到 第2考场,座位号重新进行分配,以此类推。

另外,实现考场准考证号范围分类统计如下图:

如图,准考证号范围按前4位分组统计,输出最小号与最大号范围。 

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

.netFramework 4.7.1

开发工具:VisualStudio 2019 C#

表及视图样本设计

考场表 [dlzp_kc] 设计如下:

序号字段名类型说明备注
1xm_ciduniqueidentifier所属项目ID比如某一考试项目
2kcbhnvarchar(6)考场编号按固定位补位排序
3kcmcnvarchar(50)考场名称
4kcrssmallint考场人数

含准考证号的考生视图 v_ypz 设计如下:

序号字段名类型说明备注
1xm_ciduniqueidentifier所属项目ID比如某一考试项目
2zkzhchar(8)准考证号固定8位

根据设计 v_ypz 数据集记录大于等于考场记录数,因此使用左连接以显示考场座位数不足的情况统计。

准考证号考场范围分布情况表 dlzp_kc_zkzhs 设计如下:

序号字段名类型说明备注
1xm_ciduniqueidentifier所属项目ID比如某一考试项目
2kcbhnvarchar(6)考场编号 
3kcmcnvarchar(50)考场名称冗余字段
4zkzhsnvarchar(500)准考证号范围转多行为一行数据

功能实现

生成考场数据

根据提供的EXCEL考场文件,导入到考场表(dlzp_kc)中,如何将EXCEL文件导入成数据集,可参考我的文章《C#实现Excel合并单元格数据导入数据集》,成功导入后,在查询分析器示例如下图:

生成重复的SQL语句

结合考场数据集,通过C# 循环遍历,得到我们想要的考场明细(输出容纳人数的记录数)数据集,代码如下:

//TextBox1为放置在 WebForm 上的文本框控件(多行设置)
//dt 为生成的考场数据集数据表(DataTable)

TextBox1.Text = "select b.zkzh,a.* from(select ROW_NUMBER() over(order by zkzh) xh,zkzh  from v_ypz where xm_cid='" + _xm_cid + "' and zkzh is not null)  b left join (select ROW_NUMBER() over(order by kcbh) as xh,* from (";

string dsql = "\r\nselect top {0} '{1}' kcbh,'{2}' kcmc,{3} kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz \r\n {4}";
for (int i = 0; i < dt.Rows.Count; i++)
{
    TextBox1.Text += string.Format(dsql, dt.Rows[i]["kcrs"].ToString(), dt.Rows[i]["kcbh"].ToString(), dt.Rows[i]["kcmc"].ToString(),
                dt.Rows[i]["kcrs"].ToString(), i == dt.Rows.Count - 1 ? "" : "union all");
}

TextBox1.Text += ") a) a on a.xh=b.xh ";

该程序片断可辅助我们生成想要的SQL语句,以避免重复劳动,生成的最终结果如下:

select b.zkzh,a.* from 
(select xm,sfzh,ROW_NUMBER() over(order by zkzh) xh,zkzh from v_ypz where xm_cid='16286689-1097-4b9d-8c2a-06b4588ec289' and zkzh is not null)  b 
left join (
select ROW_NUMBER() over(order by kcbh) as xh,* from (
select top 30 '001' kcbh,'第1考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '002' kcbh,'第2考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh  from v_ypz 
 union all
select top 30 '003' kcbh,'第3考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '004' kcbh,'第4考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '005' kcbh,'第5考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '006' kcbh,'第6考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '007' kcbh,'第7考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 

 ) a) a on a.xh=b.xh

在主表 v_ypz 按准考证号升序生成总序号(xh) ROW_NUMBER() over(order by zkzh) xh,考场明细视图按考场编号升序生成总序号 (xh)ROW_NUMBER() over(order by kcbh) as xh,其中每个考场的则按考场编号生成座位号(zwh)ROW_NUMBER() over(order by kcbh) zwh,最后我们通过左连接即可得到我们想要的分配明细情况结果。

封装为统计视图

将上述分配明细查询进一步进行统计准考证号范围,封装为视图 v_a,SQL 语句如下:

create view [dbo].[v_a] as 
select kcbh,kcmc,lzkzh,zkzh2,zkzh3 from (select *,left(zkzh,4) lzkzh,
min(right(zkzh,4)) over (partition by kcbh,left(zkzh,4) order by kcbh,left(zkzh,4)) zkzh2,
max(right(zkzh,4)) over (partition by kcbh,left(zkzh,4) order by kcbh,left(zkzh,4)) zkzh3 
from ( 
select b.sfzh,b.xm,b.zkzh,a.* from(select xm,sfzh,ROW_NUMBER() over(order by zkzh) xh,zkzh  from v_ypz where xm_cid='16286689-1097-4b9d-8c2a-06b4588ec289' and zkzh is not null)  b left join (
select ROW_NUMBER() over(order by kcbh) as xh,* from (
select top 30 '001' kcbh,'第1考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '002' kcbh,'第2考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '003' kcbh,'第3考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '004' kcbh,'第4考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '005' kcbh,'第5考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '006' kcbh,'第6考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 union all
select top 30 '007' kcbh,'第7考场' kcmc,30 kcrs,ROW_NUMBER() over(order by kcbh) zwh from v_ypz 
 ) a) a on a.xh=b.xh   ) a   ) a  group by kcbh,kcmc,lzkzh,zkzh2,zkzh3
GO

其中我们通过 partition by 函数 按考场编号 及 左截取准考证号前4位(分类号)进行分区计算右截取准考证号的后4位,取最小号和最大号,如(zkzh2 为最小序号):

min(right(zkzh,4)) over (partition by kcbh,left(zkzh,4) order by kcbh,left(zkzh,4)) zkzh2

(zkzh3 为最大序号):

max(right(zkzh,4)) over (partition by kcbh,left(zkzh,4) order by kcbh,left(zkzh,4)) zkzh3

运行结果示例如下:

如图我们可以看到 lzkzh 为左截取的4位准考证分类号,zkzh2为最小号,zkzh3为最大号(本考场内),像第6考场,有两个分类范围,为了便于更直观的显示数据,将其显示为一行,我们可以编写存储过程来实现这一需求。 

编写存储过程实现统计

存储过程示例代码如下:

CREATE PROCEDURE [dbo].[kc_zkzhs] 
		   @xm_cid uniqueidentifier
AS
BEGIN
	delete dlzp_kc_zkzhs where xm_cid=@xm_cid 
	insert into dlzp_kc_zkzhs(xm_cid,kcbh,kcmc,zkzhs) select @xm_cid,kcbh,kcmc,'' zkzhs from  dlzp_kc where xm_cid=@xm_cid 


	declare @kcbh nvarchar(50)
	declare @lzkzh nvarchar(4)
	declare @zkzh2 nvarchar(4)
	declare @zkzh3 nvarchar(4)

	DECLARE _cursor CURSOR FOR  
	
		SELECT  kcbh,lzkzh,zkzh2,zkzh3 from v_a order by kcbh,lzkzh,zkzh2,zkzh3
	
	OPEN _cursor;  
    

	FETCH NEXT FROM _cursor  INTO @kcbh,@lzkzh,@zkzh2,@zkzh3  
	WHILE @@FETCH_STATUS = 0  
	BEGIN  
		update dlzp_kc_zkzhs set zkzhs=zkzhs+@lzkzh+@zkzh2+' - '+@lzkzh+@zkzh3+char(13)+char(10) 
		where xm_cid=@xm_cid  and kcbh=@kcbh
		
		FETCH NEXT FROM _cursor  INTO @kcbh,@lzkzh,@zkzh2,@zkzh3   
	END  
  
	CLOSE _cursor;  
	DEALLOCATE _cursor;
	select a.kcbh 考场编号,a.kcmc 考场名称,b.kcrs 容纳人数,a.zkzhs 准考证范围  from dlzp_kc_zkzhs a,dlzp_kc b 
	where a.xm_cid=@xm_cid  and a.xm_cid=b.xm_cid and a.kcbh=b.kcbh
	order by a.kcbh
end

运行该存储过程可以将多行统计数据合并为单行进行显示,显示结果如下效果:

 

 

小结

1、我们的实际操作中有一百多个考场,为避免冗长的代码,示例代码片断并不完整,在这里仅为方便参考。

2、将多行转单行统计可以有很多种方法(比如STUFF函数),本文在这里编写的是存储过程,是一种比较兼容的写法,性能也还不错,否则使用 STUFF 大数据运算(视图)的时候,效果并不理想。更多方法可参考我的文章 《MS SQL Server STUFF 函数实战 统计记录行转为列显示》

3、更多 partition by 的聚合统计方法可参考我的文章 《MS SQL Server partition by 函数实战 统计与输出》

至此 partition by 的实例应用我们就介绍到这里,具体使用中我们还需要灵活掌握。感谢您的阅读,希望本文能够对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZeroEA阅读笔记

ZeroEA阅读笔记 摘要 实体对齐(EA)是知识图(KG)研究中的一项关键任务&#xff0c;旨在识别不同知识图谱中的等效实体&#xff0c;以支持知识图谱集成、文本到SQL和问答系统等下游任务。考虑到KG中丰富的语义信息&#xff0c;预训练语言模型(PLM)凭借其卓越的上下文感知编码功…

使用SSMS操作AdventureWorks 示例数据库

简介 AdventureWorks 示例数据库&#xff0c;官方文档&#xff1a;https://learn.microsoft.com/zh-cn/sql/samples/adventureworks-install-configure?viewsql-server-ver16&tabsssms 下载备份文件 OLTP 数据适用于大多数典型的联机事务处理工作负载。数据仓库 (DW) 数据…

网络设备监控工具 PIGOSS BSM 网络设备-Ruijie设备SNMP配置及监控

目录 1. 全局模式 2. 配置SNMP V2 3. 配置SNMP V3 4. 配置SNMP Trap 5. 保存配置 6. 查看配置结果 7. 锐捷设备监控 1. 全局模式 SNMP 的配置工作在网络设备的全局配置模式下完成&#xff0c;在进行SNMP 配置前&#xff0c;请先进入全局配置模式。 Ruijie>enable …

Excel“取消工作表保护”忘记密码并恢复原始密码

文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑&#xff0c;提示如下&#xff0c;但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件&#xff1b; 2、依次点击菜单栏上的视图—宏----录制宏&#xf…

Spring Boot内嵌Tomcat处理请求的链接数和线程数

Spring Boot内嵌Tomcat处理请求的连接数和线程数 处理请求的连接数和线程数配置 Spring Boot的配置项 #等待连接数 server.tomcat.accept-count100 #最大链连接数 server.tomcat.max-connections8192#最小备用线程数 server.tomcat.threads.min-spare10 #最大工作线程数 ser…

【git命令相关】git上传和删除文件步骤

&#xff08;一&#xff09;git登录 1. git bash窗口输入 git config --global user.name "你的Git账号" git config --global user. Email "你的Git邮箱"2. 生成密钥 ssh-keygen -t rsa -C "你的Git邮箱"在此命令执行的返回结果中找到key存放…

海康VisionMaster使用学习笔记11-VisionMaster基本操作

VisionMaster基本操作 VM示例方案 1. 工具拖拽及使用方式 分别从采集和定位栏里拖拽图像源,快速匹配,Blob分析工具 2. 模块连线 依次连线 3.如何订阅 点击快速匹配,可以看到输入源已订阅了图像1的图像,Blob分析类似 4. 方案操作及全局触发 点击快速匹配,创建特征模版,框选…

vue-cli搭建过程,elementUI搭建使用过程

vue-cli vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义 好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个 骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;我们的开发更加的快速。…

深兰科技荣获CFS第十三届财经峰会“2024杰出出海品牌引领奖”

近日&#xff0c;以“向新而行&#xff0c;新质生产力激发新活力”为主题的“CFS2024第十三届财经峰会暨Amazing 2024创新企业家节”在北京隆重开幕。峰会揭晓了第十三届“CFS 2024企业奖”的评选结果&#xff0c;深兰科技凭借自身在AI机器人出口和海外市场开拓等品牌全球化方面…

60KW~180KW一体式充电桩电路方案!

本次小编给大家带来了一款60KW~180KW的一体式充电桩电路方案&#xff0c;本方案包含接线图&#xff0c;电路原理图&#xff0c;PCB图&#xff0c;BOM&#xff0c;协议说明&#xff0c;产品标准等资料&#xff01; 下载链接&#xff01;https://t.1yb.co/KW1R 本方案采用STM32F…

std::wcout,std::cout控制台输出中文乱码,std::cerr字符串的字符无效

系列文章目录 文章目录 系列文章目录前言一、中文乱码原因二、解决方法1.如果是windos11下&#xff0c;使用英文语言&#xff0c;需要加以下代码2.如果是中文语言只需要一行关键代码3.如果在异常处理中显示宽字符中文4.完整代码如下&#xff1a;实现文件测试代码输出打印 前言 …

【图像特效系列】图像毛玻璃特效的实践 | 包含代码和效果图

目录 一 毛玻璃特效 1 代码 2 效果图 图像特效系列主要是对输入的图像进行处理,生成指定特效效果的图片。图像素描特效会将图像的边界都凸显出来;图像怀旧特效是指图像经历岁月的昏暗效果;图像光照特效是指图像存在一个类似于灯光的光晕特效,图像像素值围绕光照中心点呈…

极光推送(JPush)携手中大英才,打造智慧教育新模式

随着互联网技术的快速发展&#xff0c;在线教育行业蓬勃兴起&#xff0c;用户对学习体验的要求也越来越高。作为国内领先的职业技能知识培训服务商&#xff0c;中大英才(北京)网络教育科技有限公司(简称“中大英才”)始终致力于为多层次求知学习人士提供专业化、智能化和科学化…

实战演练:通过API获取商品详情并展示

实战演练&#xff1a;通过API获取商品详情并展示&#xff0c;通常涉及以下几个步骤&#xff1a;确定API接口、发送HTTP请求、处理响应数据、以及将数据展示给用户。这里我们以一个假想的商品详情API为例&#xff0c;使用Python语言和requests库来完成这个任务。 步骤 1: 确定A…

DMHS数据同步工具

DMHS数据同步工具 ​ 本章节主要介绍DM数据同步工具DMHS的使用&#xff0c;通过将oracle11g的数据同步到DM8的过程来理解DMHS的功能和作用。 安装前的准备 端口、服务信息 IP地址服务名称版本端口安装路径192.168.19.136OracleOracle11.0.21521/opt/oracle/DMHS源端dmhs_V3…

第100+22步 ChatGPT学习:概率校准 Platt Scaling

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

MapBox Android版开发 1 配置

MapBox Android版开发 1 配置 前言MapBox V9 配置创建工程配置地图配置私钥配置公钥配置仓库配置依赖配置权限地图初始化 显示地图布局文件地图Activity 运行效果 MapBox V11 配置创建工程配置地图配置私钥配置公钥配置仓库配置依赖配置权限 显示地图布局文件 运行效果 前言 本…

ee trade:黄金投资与股票投资的区别

黄金和股票&#xff0c; 是金融市场中两种常见的投资工具&#xff0c; 它们拥有截然不同的特点和风险&#xff0c; 了解它们的差异&#xff0c; 可以帮助投资者制定更合理的投资策略。 一、 投资性质&#xff1a; 避险与成长&#xff0c; 两种投资方向 黄金&#xff1a; 被视…

金价徘徊高位,市场聚焦美联储降息预期

现货黄金高位震荡 周二亚市早盘&#xff0c;现货黄金在2500美元/盎司关口附近徘徊&#xff0c;交投于2503.23美元/盎司附近。金价周一在创纪录的高位后出现回调&#xff0c;投资者从涨势中获利了结&#xff0c;并根据美联储的线索调整仓位&#xff0c;现货黄金最终收报2504.1…

Vue - 详细介绍 vue-monoplasty-slide-verify vue3-puzzle-vcode 滑动验证组件

Vue - 详细介绍 vue-monoplasty-slide-verify & vue3-puzzle-vcode 滑动验证组件 在日常的账号登录所需要的大部分是滑动验证来检验人为操作&#xff0c;免于字母验证码的繁琐输入&#xff0c;下面介绍在Vue2和Vue3中适用的滑动验证组件。 1、vue-monoplasty-slide-verif…