如何在SQL Server中实现Ungroup操作

这篇具有很好参考价值的文章主要介绍了如何在SQL Server中实现Ungroup操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

我们经常在SQL Server中使用group by语句配合聚合函数,对已有的数据进行分组统计。本文主要介绍一种分组的逆向操作,通过一个递归公式,实现ungroup操作。

代码和实现

我们看一个例子,输入数据如下,我们有一张产品表,该表显示了产品的数量。
如何在SQL Server中实现Ungroup操作,T-SQL,数据库,java,数据库,服务器
要求实现Ungroup操作,最后输出数据如下:
如何在SQL Server中实现Ungroup操作,T-SQL,数据库,java,数据库,服务器

代码和实现

基本思路

要想实现ungroup,显然需要表格的自连接。自连接的次数取决于total_count的数量。

代码

自连接操作过程中涉及大量的子查询,为了便于代码后期维护,我们采用CTE。每次子查询,total_count自动减一,total_count小于0时,直接过滤掉,该数据不再参与查询。

第1轮查询

获取全部total_count 大于0的数据,即全表数据。

with cte1 as (
	select * from products where total_count > 0
),

输出结果:
如何在SQL Server中实现Ungroup操作,T-SQL,数据库,java,数据库,服务器

第2轮查询

第2轮子查询,以第1轮的输出作为输入,进行表格自连接,total_count减1,过滤掉total_count小于0的产品。

with cte1 as (
	select * from products where total_count > 0
),

cte2 as (

select * from (
	select cte1.id, cte1.name, (cte1.total_count -1) as total_count from cte1
	join products p1 
	on cte1.id = p1.id) t 
where t.total_count > 0
)

select * from cte2

输出结果是:
如何在SQL Server中实现Ungroup操作,T-SQL,数据库,java,数据库,服务器
和第1轮相比较,输出结果中没了Flashlight了,因为它的total_count减1后为0,被过滤了。

第3轮查询

第3轮子查询,以第2轮的输出作为输入,进行表格自连接,total_count减1,过滤掉total_count小于0的产品。

with cte1 as (
	select * from products where total_count > 0
),

cte2 as (

select * from (
	select cte1.id, cte1.name, (cte1.total_count -1) as total_count from cte1
	join products p1 
	on cte1.id = p1.id) t 
where t.total_count > 0
),
cte3 as (

select * from (

	select cte2.id, cte2.name, (cte2.total_count -1) as total_count from cte2
	join products p1 
	on cte2.id = p1.id) t 

where t.total_count > 0
)

select * from cte3

输出结果如下:

如何在SQL Server中实现Ungroup操作,T-SQL,数据库,java,数据库,服务器

第4轮查询

第4轮子查询,以第3轮的输出作为输入,进行表格自连接,total_count减1,过滤掉total_count小于0的产品。

with cte1 as (
	select * from products where total_count > 0
),

cte2 as (
select * from (
	select cte1.id, cte1.name, (cte1.total_count -1) as total_count from cte1
	join products p1 
	on cte1.id = p1.id) t 
where t.total_count > 0
),

cte3 as (

select * from (
	select cte2.id, cte2.name, (cte2.total_count -1) as total_count from cte2
	join products p1 
	on cte2.id = p1.id) t 
where t.total_count > 0
),

cte4 as (

select * from (
	select cte3.id, cte3.name, (cte3.total_count -1) as total_count from cte3
	join products p1 
	on cte3.id = p1.id) t 
where t.total_count > 0
)

select * from cte4

输出结果:

如何在SQL Server中实现Ungroup操作,T-SQL,数据库,java,数据库,服务器
下一次迭代,compass的total_count也将等于0,被过滤掉,查询结果不会再有新的记录,所以查询结束。我们将cte1,cte2,cte3 和 cte4 合并,合并结果即是所求。

代码改进

显然上述代码过于冗长,如果产品数量很多,那子查询的代码也将大幅度增加。

事实上,从第2轮到第4轮的子查询,代码是非常相近的,对于这种情况,无论任何开发语言,我们都可以采用递归的方式进行优化处理。对于此类为题,递归公式如下:

with CTE as (
	initial query  -- 初始查询
	union all -- 查询结果合并
	recursive query -- 递归部分,即在查询中直接引用CTE
	Recursive terminatation condition -- 递归终止条件
)

初始查询,就是我们的第1轮迭代。递归部分,就是我们所谓的相似代码部分。

对于递归终止条件,默认是如果没有新的记录参加递归,则递归终止。本例是按照业务逻辑,设置的终止条件,即total_count需要大于0,这样也可以做到过滤到最后,不会再有新的记录参与到递归中。

按照上述供述,得到的查询代码如下:

with cte as (
	select * from products where total_count > 0
	union all
	select * from (
		select cte.id, cte.name, (cte.total_count -1) as total_count from cte
			join products p1 
		on cte.id = p1.id) t 
	where t.total_count > 0
)

select id, name from cte
order by id, name

当我们使用CTE时候,发现每次查询的代码类似,就可以考虑采用上述递归公式对代码进行优化。找到初始查询结果,在相似的代码中找到递归部分以及递归终止条件。

附录

建表和数据初始化代码文章来源地址https://www.toymoban.com/news/detail-529041.html

if OBJECT_ID('products', 'U') is not null 
drop table products

create table  products 
(
	id int primary key identity(1,1),
	name nvarchar(50) not null,
	total_count int not null
)

insert into products (name, total_count) values 
('Water Bottle', 3),
('Tent', 2),
('Flashlight', 1),
('compass',4)

到了这里,关于如何在SQL Server中实现Ungroup操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SQL server】数据库入门基本操作教学

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 数据库是计算机系统中用于存储和管理数据的一种软件系统。它通常由一个或多个数据集合、管理系统和应用程序组成,被广泛应用于企业、政府和个人等各种领域。目前常用的数据库系统包括关系型数据库和非关系型

    2024年02月07日
    浏览(49)
  • python连接并简单操作SQL server数据库

    环境: pycharm 、SQLserver版本2019 1.首先,在pycharm中点击File,找到setting——project:***,点击”+“,引入pymssql库 2.编写代码连接数据库,并对数据库进行查询等简单操作(此处仅展示查询)  3.在sql server中由于之前使用windows验证模式进入数据库管理器,所以要身份验证修改,

    2024年02月08日
    浏览(58)
  • .NET集成DeveloperSharp操作Sql Server数据库

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。 本文提供了一种结合“原生Sql+轻量级ORM”操作各类数据库的工具。 该工具几乎只使用了一个方法/函数,却实现了几乎所有的数据操作功能。 它已成功应用到了人工智能、产业互联网、智慧医疗、等多个大型项目

    2024年03月18日
    浏览(61)
  • Python:利用pymssql模块操作SQL server数据库

    python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以。这篇文章,介绍下如何在Windows下安装pymssql库并进行连接使用。。。 环境:Windows_64位 版本:python3.6 一、简单介绍 pymssql是一个python的数据库接口,基于FreeTDS构建,对_mssql模块进行了封装,遵循python的DBAP

    2024年02月12日
    浏览(52)
  • Java连接SQL Server数据库的详细操作流程

    1.1 JDK版本查看 win + r输入cmd,命令窗口输入java --version 1.2 SQL Server官网下载驱动 SQL Server驱动下载直达地址 下载完成后解压到自己熟悉的目录,不出意外的话你会看到以下文件 1.3 加载驱动类 1.4 eclipse导入驱动jar包 目录结构 右键当前工程文件,选择 build path ,然后选择 Add Exter

    2024年02月03日
    浏览(68)
  • ASP.NET连接数据库(SQL Server)的操作

    1.创建好项目后在我们的Web.config里面连接SQL Server数据库  2.写入代码 appSettings add key=\\\"conStr\\\" value=\\\"Data Source=localhost;Initial Catalog=s;Integrated Security=True;\\\" / /appSettings conStr是字段名字,后面连接需要,localhost是本地地址的意思,s是数据库中的表名。 3.选中shujuku练习右击,选择添加,

    2023年04月08日
    浏览(51)
  • Windows server 2016——SQL server T-SQL查询语句

    作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。  公众号: 网络豆  座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 目录 写在前面 介绍 一.SQL简介 1.SQL和T-SQL 2.T-SQL的组成 二.使用T-SQL语句操作数据表 1.插入数据 2.更新数据 ​编

    2024年02月09日
    浏览(52)
  • Python 通过pymssql访问查询操作 SQL Server数据库

    在企业应用开发中,经常用到应用程序访问数据库的开发模式,中小企业使用的数据库中,以ms SQL Server居多。本文就以一个简单的实例模型,简单介绍一下python访问ms sql sever数据库的方法。 本文中以下面的本地SQL Server数据库为例进行数据库连接,数据表的查询、增加、删除

    2024年02月10日
    浏览(106)
  • C#SQL Server数据库基本操作(增、删、改、查)

    C#连接数据库是一项非常重要的任务,在软件开发中,我们通常需要将数据存储到数据库中,并且需要使用C#代码在应用程序中与数据库进行交互。在本文中,我们将学习如何使用C#连接到数据库,以及如何完成常见的增删改查操作。 首先要连接数据库,需要使用System.Data.Sq

    2024年02月08日
    浏览(71)
  • 实战Java springboot 采用Flink CDC操作SQL Server数据库获取增量变更数据

    目录 前言: 1、springboot引入依赖: 2、yml配置文件 3、创建SQL server CDC变更数据监听器 4、反序列化数据,转为变更JSON对象 5、CDC 数据实体类 6、自定义ApplicationContextUtil 7、自定义sink 交由spring管理,处理变更数据         我的场景是从SQL Server数据库获取指定表的增量数据,查

    2024年02月10日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包