大家好,我是全栈小5,欢迎来到《小5讲堂》。
这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 前言
  • 示例
    • 数据集
    • 数据分组
    • 增加排序
  • 查询小技巧
    • 1. 使用 `WITH TIES` 获取并列结果(分页查询时特别有用)
    • 2. 使用 `OUTPUT` 子句捕获DML操作结果(避免二次查询)
    • 3. 使用 `CROSS APPLY` 优化复杂查询(替代JOIN的更好选择)
  • 文章推荐

前言

很久没有写报表了,今天尝试写下报表就遇到了一个常见但是太久了有点忘了的知识点。
那就是如何让指定字段的行数据转为一个字段显示并以逗号的形式隔开,一起来探讨下!

示例

STRING_AGG 是SQL Server 2017引入的新函数,更简洁高效

数据集

模拟表格数据,如下

select '张三' as NameText,'语文' as SubjectText
union all
select '张三' as NameText,'数学' as SubjectText
union all
select '张三' as NameText,'英语' as SubjectText
union all
select '张三' as NameText,'物理' as SubjectText
union all
select '张三' as NameText,'化学' as SubjectText
union all
select '张三' as NameText,'生物' as SubjectText
union all
select '张三' as NameText,'历史' as SubjectText
union all
select '张三' as NameText,'政治' as SubjectText
union all
select '张三' as NameText,'地理' as SubjectText
union all
select '张三' as NameText,'体育' as SubjectText
union all
select '张三' as NameText,'音乐' as SubjectText
union all
select '张三' as NameText,'美术' as SubjectText
union all
select '李四' as NameText,'体育' as SubjectText
union all
select '李四' as NameText,'音乐' as SubjectText
union all
select '李四' as NameText,'美术' as SubjectText

在这里插入图片描述

数据分组

以姓名为分组,增加多一个科目字段,并且科目名称以逗号形式隔开,效果如下:
在这里插入图片描述

string_agg(cast(字段 as varchar), ‘,’) as 自定义名称

select t.NameText
,string_agg(cast(t.SubjectText as varchar), ',') as ALLSubject
from(select '张三' as NameText,'语文' as SubjectTextunion allselect '张三' as NameText,'数学' as SubjectTextunion allselect '张三' as NameText,'英语' as SubjectTextunion allselect '张三' as NameText,'物理' as SubjectTextunion allselect '张三' as NameText,'化学' as SubjectTextunion allselect '张三' as NameText,'生物' as SubjectTextunion allselect '张三' as NameText,'历史' as SubjectTextunion allselect '张三' as NameText,'政治' as SubjectTextunion allselect '张三' as NameText,'地理' as SubjectTextunion allselect '张三' as NameText,'体育' as SubjectTextunion allselect '张三' as NameText,'音乐' as SubjectTextunion allselect '张三' as NameText,'美术' as SubjectTextunion allselect '李四' as NameText,'体育' as SubjectTextunion allselect '李四' as NameText,'音乐' as SubjectTextunion allselect '李四' as NameText,'美术' as SubjectText
) t
group by t.NameText

增加排序

通过输出结果可能会注意到,以逗号隔开的文本不是按顺序,和表格本身排序不一致。
假设根据id进行升序排序输出,确保一致,如下:
在这里插入图片描述

string_agg(cast(字段 as varchar), ‘,’) within group (order by 排序字段 asc) as 自定义名称

select t.NameText
,string_agg(cast(t.SubjectText as varchar), ',') within group (order by t.id asc) as ALLSubject
from(select 1 as id,'张三' as NameText,'语文' as SubjectTextunion allselect 2 as id,'张三' as NameText,'数学' as SubjectTextunion allselect 3 as id,'张三' as NameText,'英语' as SubjectTextunion allselect 4 as id,'张三' as NameText,'物理' as SubjectTextunion allselect 5 as id,'张三' as NameText,'化学' as SubjectTextunion allselect 6 as id,'张三' as NameText,'生物' as SubjectTextunion allselect 7 as id,'张三' as NameText,'历史' as SubjectTextunion allselect 8 as id,'张三' as NameText,'政治' as SubjectTextunion allselect 9 as id,'张三' as NameText,'地理' as SubjectTextunion allselect 10 as id,'张三' as NameText,'体育' as SubjectTextunion allselect 11 as id,'张三' as NameText,'音乐' as SubjectTextunion allselect 12 as id,'张三' as NameText,'美术' as SubjectTextunion allselect 13 as id,'李四' as NameText,'体育' as SubjectTextunion allselect 14 as id,'李四' as NameText,'音乐' as SubjectTextunion allselect 15 as id,'李四' as NameText,'美术' as SubjectText
) t
group by t.NameText

查询小技巧

以下是三个能提高你SQL Server查询效率和便利性的实用技巧:

1. 使用 WITH TIES 获取并列结果(分页查询时特别有用)

-- 获取前10条记录,包括与第10条记录值相同的所有记录
SELECT TOP 10 WITH TIES column1, column2
FROM table_name
ORDER BY column1 DESC;

应用场景:当你想获取排名靠前的记录,但不想因为TOP N的限制而遗漏与第N条记录值相同的其他记录。

2. 使用 OUTPUT 子句捕获DML操作结果(避免二次查询)

-- 更新数据同时返回被更新的记录
UPDATE table_name
SET column1 = 'new_value'
OUTPUT inserted.*  -- 返回更新后的数据
WHERE condition;-- 删除数据同时返回被删除的记录
DELETE FROM table_name
OUTPUT deleted.*  -- 返回被删除的数据
WHERE condition;

优势:减少数据库往返次数,提高效率,特别适合需要记录变更的场景。

3. 使用 CROSS APPLY 优化复杂查询(替代JOIN的更好选择)

-- 获取每个客户的最新订单
SELECT c.CustomerID, c.CustomerName, o.OrderDate, o.Amount
FROM Customers c
CROSS APPLY (SELECT TOP 1 OrderDate, AmountFROM OrdersWHERE CustomerID = c.CustomerIDORDER BY OrderDate DESC
) o;

优势

  • 比子查询更高效
  • 比LEFT JOIN + GROUP BY更简洁
  • 特别适合需要为每行主表获取一个相关子表记录的场景

这些技巧能帮助你写出更高效、更简洁的SQL查询语句,提高数据库操作效率。

文章推荐

【数据库】使用Sql Server将分组后指定字段的行数据转为一个字段显示,并且以逗号隔开每个值,收藏不迷路

【数据库】SQL Server 查询条件小技巧:ISNULL 函数的使用,有请DeepSeek来辅助讲解下

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

【Sql Server】使用row_number over方式进行表分页,数据量达到五千多条记录后,查询变慢需要20多秒的解决方案

【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用

【Sql Server】锁表如何解锁,模拟会话事务方式锁定一个表然后进行解锁

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

【Sql Server】Update中的From语句,以及常见更新操作方式

【Sql server】假设有三个字段a,b,c 以a和b分组,如何查询a和b唯一,但是c不同的记录

【Sql Server】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.项目起步(1)

1,项目起步-初始化项目并使用git管理创建项目并精细化配置src目录调整git 管理项目2项目起步-配置别名路径联想提示什么是别名路径联想提示如何进行配置 (自动配置了){"compilerOptions" : {"baseUrl" : "./",…

【C++详解】深入解析继承 类模板继承、赋值兼容转换、派生类默认成员函数、多继承与菱形继承

文章目录一、继承概念二、继承定义定义格式继承后基类成员访问方式的变化类模板的继承三、基类和派⽣类间的转换(赋值兼容转换)四、继承中的作用域隐藏规则两道笔试常考题五、派生类的默认成员函数四个常见默认成员函数实现⼀个不能被继承的类六、继承与友元七、继承与静态成员…

加法器 以及ALU(逻辑算术单元)

加法器框架,首先介绍原理,然后引入一位加法器最后再引入多位加法器最后引入带符号的加法器这一节涉及到的硬件电路的知识理解就好,实在看不懂就跳过,但是封装以后的功能必须看懂。这是一个一般的加法过程涉及到的必要元素图中已经…

设计模式实战:自定义SpringIOC(亲手实践)

上一篇:设计模式实战:自定义SpringIOC(理论分析) 自定义SpringIOC(亲手实践) 上一篇文章,我们介绍了SpringIOC容器的核心组件及其作用,下面我们来动手仿写一个SpringIOC容器&#…

力扣面试150(42/150)

7.28 20. 有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一…

基于黑马教程——微服务架构解析(二):雪崩防护+分布式事务

之前的两篇文章我们介绍了微服务的基础概念及其服务间通信机制。本篇将深入探讨微服务的核心保障:服务保护与分布式事务。一、微服务保护问题描述: 在一个购物车的微服务中,倘若某一项服务(服务A)同一时刻访问的数据十…

LeetCode: 429 N叉树的层序遍历

题目描述给定一个 N 叉树,返回其节点值的层序遍历(即从左到右,逐层访问每一层的所有节点)。示例输入格式(层序序列化):输入示意:1/ | \3 2 4/ \5 6输出:[[1], [3,2,4…

使用phpstudy极简快速安装mysql

使用 phpStudy 极简快速安装 MySQL 的完整指南: 一、phpStudy 简介 phpStudy 是一款 Windows 平台下的 PHP 环境集成包,包含: Apache/Nginx PHP 5.x-7.x MySQL 5.5-8.0 phpMyAdmin 二、安装步骤 1. 下载安装包 访问官网下载&#xf…

git lfs使用

apt install git lfs 或者下载二进制文件加到环境变量 https://github.com/git-lfs/git-lfs/releases git lfs install git lfs clone huggingface文件路径 如果访问不了hugggingface.co用hf-mirror.com替代,国内下载速度还是挺快的 先按照pip install modelscope m…

6、CentOS 9 安装 Docker

🐳 CentOS 9 安装 Docker 最全图文教程(含镜像源优化与常见问题解决)标签:CentOS 9、Docker、容器技术、开发环境、国内镜像源 适合读者:后端开发、运维工程师、Linux 初学者📌 前言 在 CentOS 9 上安装 Do…

SystemV消息队列揭秘:原理与实战

目录 一、消息队列的基本原理 1、基本概念 2、基本原理 3、消息类型的关键作用 4、重要特性总结 5、生命周期管理 6、典型应用场景 二、System V 消息队列的内核数据结构 1、消息队列的管理结构 msqid_ds(消息队列标识符结构) 关键字段解析 2…

5 分钟上手 Firecrawl

文章目录Firecrawl 是什么?本地部署验证mcp安装palyground🔥 5 分钟上手 FirecrawlFirecrawl 是什么? 一句话: 开源版的 “最强网页爬虫 清洗引擎” • 自动把任意网页 → 结构化 Markdown / JSON • 支持递归整站抓取、JS 渲染…

算法训练营day31 贪心算法⑤56. 合并区间、738.单调递增的数字 、968.监控二叉树

贪心算法的最后一篇博客!前面两道题都是比较简单的思路,重点理解一下最后一道题即可。有一说一,进入到贪心算法这一章节之后,我的博客里和代码注释里的内容明显少了很多,因为很多贪心的题目我觉得不需要很复杂的文字说…

Jenkins流水线部署+webhook2.0

文章目录1. 环境2. 用到的插件3. 流水线部署脚本1. 环境 Centos7Jenkins2.5.0JDKopen17阿里云仓库 注意:这个版本兼容需要特别注意,要不然会很麻烦 2. 用到的插件 Generic Webhook Trigger 3. 流水线部署脚本 兼容钩子部署(webhook&…

IDM下载失败排查

网络连接问题排查检查网络连接是否稳定,确保能够正常访问互联网 测试其他下载工具或浏览器是否能够正常下载 尝试关闭防火墙或杀毒软件,排除安全软件拦截的可能性代理和VPN设置检查确认IDM的代理设置是否正确,是否与系统代理一致 检查是否使用…

Anaconda安装时的几个操作

一、安装Anaconda 其实Anaconda的安装比较简单,点击next就好了。在安装中需要注意以下两点: 1、选择安装路径 在安装时,路径最好选择非C盘,且路径中不要出现中文,以免后期运行代码时出现不必要的错误。 我安装时&…

网易易盾、腾讯ACE等主流10款游戏反外挂系统对比

本文将深入对比10款游戏反外挂系统:1.网易易盾;2.Ricochet Anti‑Cheat;3.BattlEye;4.几维安全手游智能反外挂系统;5.伏魔AI反外挂;6.Riot Vanguard;7.Xigncode3;8.盛大GPK&#xff…

wpa_supplicant-2.10交叉编译

参考文章:https://blog.csdn.net/weixin_45783574/article/details/145810790 1、Openssl交叉编译 1.1 下载openssl-1.1.1t.tar.gz 下载网址: https://openssl-library.org/source/old/1.1.1/index.html1.2 编译 sudo tar xvf openssl-1.1.1t.tar.gz cd openssl-1.1

源码解读SpringCloudAlibaba Nacos2.x

Nacos 服务注册 Nacos 服务注册时,客户端会将自己的信息注册到Nicosserver上,形成key-value组合,其中key通常是服务名称,value是实例地址信息。在二点X版本中,客户端通过Spring Boot的扩展机制(例如web_initialized事件…

Windows 11 下 Anaconda 命令修复指南及常见问题解决

Windows 11 下 Anaconda 命令修复指南及常见问题解决 在使用 Anaconda 过程中,可能会遇到环境损坏、更新失败、包依赖冲突等问题。本文整理了一套通过命令行修复 Anaconda 的完整方案,适用于 Windows 11 系统,同时补充了权威参考链接供深入学…