在 SQL Server 中,如何将多行数据变成一个字符串保存。

skill
投石
挖矿
刮痧
上面三行数据想要得到结果为:投石,挖矿,刮痧

有两种方式:

  • 拼接字符串。
  • 使用 for XML

首先创建模拟用的数据

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
BEGIN
DROP TABLE #TempTable;
END
CREATE TABLE #TempTable
(
[name] VARCHAR(MAX),
[skill] VARCHAR(MAX)
)
INSERT INTO #TempTable VALUES('钟离','投石')
INSERT INTO #TempTable VALUES('钟离','挖矿')
INSERT INTO #TempTable VALUES('钟离','刮痧')
INSERT INTO #TempTable VALUES('魈','舞蹈')
INSERT INTO #TempTable VALUES('魈','插秧')
INSERT INTO #TempTable VALUES('魈','个子矮')
INSERT INTO #TempTable VALUES('可莉','超可爱')
INSERT INTO #TempTable VALUES('可莉','超萌')
INSERT INTO #TempTable VALUES('可莉','蹦蹦炸弹') --SELECT * FROM #TempTable

1. 使用拼接方式

DECLARE @skills varchar(MAX)
SET @skills = '' -- 用这种方式必须要初始化变量
SELECT @skills = @skills + ',' + [skill] FROM #TempTable WHERE [name] = '钟离'
SELECT @skills

2. 使用 for XML

SELECT ',' + [skill]
FROM #TempTable
WHERE [name] = '钟离'
FOR XML PATH('')

去掉开头的分隔符

可以使用 left, right, stuff 函数去掉分隔符

Stuff (@expression,@startIndex,@length,@replacrExpression)

  • @expression 表示 要处理的字符串
  • @startIndex 表示 开始删除字符串的位置(sql server索引从1而不是0开始)
  • @lenght 表示 删除字符串的长度
  • @replacrExpression  表示 删除后该位置 要替换的字符串
SELECT STUFF(@skills, 1, 1, '')

分组

分组需要嵌套

SELECT
[name]
, STUFF(
(SELECT ',' + [skill]
FROM #TempTable A
WHERE A.[name] = B.[name]
FOR XML PATH(''))
,1
,1
,''
) AS [skills]
FROM #TempTable B
GROUP BY [name]

[SQL Server]一列多行转换为字符串的更多相关文章

  1. sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符

    由于项目的原因,需要将一些记录分类汇总,但还要列出相关的明细,这样的需求我还是第一次遇到,蛋疼了,还是请求一下度娘吧.搜索一番还是有结果,请看以下例子: create table tb ([id] i ...

  2. sql server 使用for xml path 将1列多行转换为字符串连接起来

    create table tb ([id] )) insert into tb ,'aa' union all ,'bb' union all ,'cc' union all ,'dd' union ...

  3. SQL Server创建表超出行最大限制解决方法

    问题的现象在创建表A的时候,出现“信息 511,级别 16,状态 1,第 5 行  无法创建大小为 的行,该值大于允许的最大值 8060.”的信息提示.很奇怪,网上查了一下,是因为要插入表的数据类型的 ...

  4. SQL Server 关于列的权限控制

    在SQL SERVER中列权限(Column Permissions)其实真没有什么好说的,但是好多人对这个都不甚了解,已经被人问了几次了,所以还是在这里介绍一下,很多人都会问,我能否单独对表的某列授 ...

  5. SQL Server 索引列的顺序——真的没关系吗

    原文:SQL Server 索引列的顺序--真的没关系吗 翻译自:http://www.mssqltips.com/sqlservertip/2718/sql-server-index-column- ...

  6. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...

  7. 统计sql server 2012表的行数

    --功能:统计sql server 2012表的行数 SELECT a.name, a.object_id, b.rows, b.index_id FROM sys.tables AS a INNER ...

  8. SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行

    ylbtech-SQL Server:使用 PIVOT 行转列和 UNPIVOT 列转行 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表.PIVOT 通过将表达式某一列 ...

  9. SQL Server 2008 R2——PIVOT 行转列 以及聚合函数的选择

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

随机推荐

  1. 盘点一下Redis中常用的Java客户端,或者咱们手写一个?

    Java中那些Redis的客户端 前面我们的所有操作都是基于redis-cli来完成的,那么我们要在Java中操作Redis,怎么做呢?首先我们先来了解一下Redis Serialization Pr ...

  2. Map中getOrDefault()与数值进行比较

    一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...

  3. (五)、Docker 容器数据卷

    1.什么是数据卷 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker comm ...

  4. Noip模拟21(持续翻车)2021.7.20

    读题总是读错是不是没救了... T1 Median 中位数:按顺序排列的一组数据中居于中间位置的数. 能用上的高亮符号都用上了... 当时忘了就离谱.... 理解什么是中位数(真是个憨憨)后就可以开始 ...

  5. 震惊,本Orzer下阶段直接怒送四个笑脸

    众所周知,在hzoi帝国中,Wzx是最菜的.那么究竟有多菜呢?下面就和小编一起来看看吧. 近日,hzoi最菜的wzx在第四阶段竟然怒送4个笑脸,同机房神犇直呼wzx太菜了! 以上就是wzx第四阶段怒送 ...

  6. Elasticsearch核心技术(三):Mapping设置

    本文从Mapping简介.Dynamic Mapping.自定义Mapping和Mapping常用参数说明4个部分介绍Elasticsearch如何设置Mapping. 3.1 Mapping简介 3 ...

  7. OTA测试介绍

    OTA 测试介绍 手机的无源测试和有源测试 当前在手机射频性能测试中越来越关注整机辐射性能的测试,这种辐射性能反映了手目前主要有两种方法对手机的辐射性能进行考察:一种是从天线是目前较为传统的天线测试方 ...

  8. 常见SOC启动流程分析

    本文以s5pv210这款SOC为例,分析了其启动流程 在s5pv210的SOC内部,存在着一个内部的ROM和一个内部的RAM 这个内部的ROM叫做 IROM,它是norflash的一种.其不同于板子上 ...

  9. 零基础如何更好的学习Linux

    本节旨在介绍对于初学者如何学习 Linux 的建议.如果你已经确定对 Linux 产生了兴趣,那么接下来我们介绍一下学习 Linux 的方法. 如何去学习 学习大多类似庖丁解牛,对事物的认识一般都是由 ...

  10. 【做题记录】CF1428E Carrots for Rabbits—堆的妙用

    CF1428E Carrots for Rabbits 题意: 有 \(n\) 个萝卜,每个萝卜的初始大小为 \(a_i\) .现在要把这些萝卜切为为 \(k\) 个.吃每一个萝卜的时间为这个萝卜的大 ...