T-SQL行合并成列与列拆分成行
本文出处:http://www.cnblogs.com/wy123/p/6910468.html
感觉最近sql也没少写,突然有一点生疏了,对于用的不是太频繁的一些操作,时间一久就容易生。
多行的某一个列合并成一个列
CREATE TABLE TestColumnMergeAndSplit
(
Id int Identity(1,1),
BusinessId int,
BusinessValue varchar(20)
)
GO INSERT INTO TestColumnMergeAndSplit
SELECT 1,'AAA'
UNION ALL
SELECT 1,'BBB'
UNION ALL
SELECT 1,'CCC'
UNION ALL
SELECT 2,'XXX'
UNION ALL
SELECT 2,'YYY'
UNION ALL
SELECT 2,'ZZZ'
GO SELECT * FROM TestColumnMergeAndSplit
GO SELECT t1.BusinessId,
STUFF
(
( SELECT ','+t2.BusinessValue
FROM TestColumnMergeAndSplit t2
WHERE t2.BusinessId = t1.BusinessId
FOR
XML PATH('')
),
1,1,''
)
AS ColNames
FROM TestColumnMergeAndSplit t1
GROUP BY t1.BusinessId
GO

另外是一个相反的操作,借助上面合并之后的结果,将一个多个值的字符串列拆分开来,转换为多行,

用到的字符串拆分函数,比较常见
CREATE FUNCTION [dbo].[fn_SplitStringToTable]
(
@s VARCHAR(max),
@split VARCHAR(10)
)
RETURNS @re TABLE
(
Id INT IDENTITY(1,1),
Value VARCHAR(100)
)
AS
BEGIN IF @s IS NULL
RETURN IF @split IS NULL
RETURN IF(LEN(@split)<=0)
BEGIN
INSERT INTO @re VALUES (@s)
RETURN
END DECLARE @splitlen INT SET @splitlen=LEN(@split ) - 1
WHILE CHARINDEX(@split, @s) > 0
BEGIN
INSERT @re VALUES(LEFT(@s, CHARINDEX(@split, @s) - 1))
SET @s=STUFF(@s, 1, CHARINDEX(@split, @s) + @splitlen, '')
END
INSERT @re VALUES(@s)
RETURN
END
测试脚本,没啥技术含量
CREATE TABLE TestColumnMergeAndSplit
(
Id int Identity(1,1),
BusinessId int,
BusinessValue varchar(20)
)
GO INSERT INTO TestColumnMergeAndSplit
SELECT 1,'AAA'
UNION ALL
SELECT 1,'BBB'
UNION ALL
SELECT 1,'CCC'
UNION ALL
SELECT 2,'XXX'
UNION ALL
SELECT 2,'YYY'
UNION ALL
SELECT 2,'ZZZ'
GO SELECT * FROM TestColumnMergeAndSplit
GO
--合并多列为一列
SELECT t1.BusinessId,
STUFF
(
( SELECT ','+t2.BusinessValue
FROM TestColumnMergeAndSplit t2
WHERE t2.BusinessId = t1.BusinessId
FOR XML PATH('')
),
1,1,''
)
AS ColString
FROM TestColumnMergeAndSplit t1
GROUP BY t1.BusinessId
GO SELECT * FROM TestColumnMergeAndSplit_BAK
GO SELECT t1.BusinessId,t1.ColString,t2.Id,t2.Value
FROM TestColumnMergeAndSplit_BAK t1
CROSS APPLY dbo.fn_SplitStringToTable(ColString,',')t2
GO
T-SQL行合并成列与列拆分成行的更多相关文章
- MYSQL多行合并成一行多列
), VALUE )) INSERT INTO # VALUES (,,'), (,,'), (,,'), (,,'), (,,'), (,,'), (,,') SELECT code,MIN(nam ...
- ELK之使用filebeat的多行过滤插件把多行合并成一行
java运行日志一般有多行,格式类似如下 格式为:日期 + 日志级别 + 日志信息 有些日志是多行的,需要使用filebeat多行插件把多行合并成一行 未使用多行插件的日志格式 修改filebeat配 ...
- logstash收集java日志,多行合并成一行
使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input { ...
- mysql 行变列(多行变成一行/多行合并成一行/多行合并成多列/合并行)
数据库结构如图: 而我想让同一个人的不同成绩变成此人在这一行不同列上显示出来,此时分为2中展现: 第一种展现如图----[多行变一列](合并后的数据在同一列上): sql如下: select name ...
- SQL查询多行合并成一行
问题描述:无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数, 所以,当我们在处理下列要求时,会比较麻烦:有表tb, 如下:id value----- ---- ...
- SQL语句 分组 多行合并成一行
,,'')) FROM Table d GROUP by Id 另外: sql 单引号转义:两个单引号转义为一个单引号 set @sql='STUFF((SELECT '','' + Names FR ...
- sql多行合并成一行用逗号隔开,多表联合查询中子查询取名可重复
简单版的 SELECT a.CreateBy,Name =stuff((select ','+Name FROM SG_Client WHERE CreateBy = a.CreateBy for x ...
- editplus多行合并成一行
原文:https://www.cnblogs.com/jpfss/p/9238877.html Editplus 合并行快捷键: Ctrl+Shift+J ,选中要合并的行,再按快捷键即可
- SQL行合并
CREATE TABLE SC ( Student ), Course ) ) INSERT INTO SC SELECT N'张三',N'大学语文' UNION ALL SELECT N'李四',N ...
随机推荐
- SAS FORMAT 逻辑库存储 【输出格式 没有找到或无法加载】解决方法
SAS FORMAT 逻辑库存储 [输出格式 没有找到或无法加载]解决方法:需要指定FORMAT 搜索的路径:OPTIONS FMTSEARCH=(F WORK); 以下为完整示例代码: 00@DA ...
- Can't use Subversion command line client***Probably the path to Subversion executable is wrong. Fix
新同事要入职,赶紧收拾一下电脑:再使用SVNupdate代码时,显示Nothing to show.androidstudio不能使用svn了: 是这样婶滴,报错信息 什么情况: 好了:问题叙述完毕开 ...
- Linux交换空间(swap space)
每次安装Linux的时候,都会要求配置交换分区,那么这个分区是干嘛的呢?不设置这个分区有什么后果?如果一定要设置,设置多大比较合适?本篇将试图回答这些问题并尽量覆盖所有swap相关的知识. 下面的所有 ...
- oracle取出多个字段列中的最大值和最小值
greatest 函数和least函数 select serverid, greatest(e.core0, e.core1, e.score2 ) from e
- SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- 【Fiddler学习】Fiddler面板的详细介绍(转)
转自:https://www.cnblogs.com/GreenLeaves/p/6971452.html 下面开始分析主界面的功能区: 1.Fiddler菜单栏,上图黑色部分,包括捕获http请求, ...
- 报错,但不影响运行ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
参考:http://blog.csdn.net/zxl0016/article/details/7327125 eclipse 3.4+jdk1.6 编译正常通过,运行debug模式时报错 ERROR ...
- RPC通信原理
什么是 RPCRPC(Remote Procedure Call Protocol)远程过程调用协议.通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算上的某个过程或函数,就像调用本地应 ...
- 【Servlet】监听器入门
- Notes on Noise Contrastive Estimation and Negative Sampling
Notes on Noise Contrastive Estimation and Negative Sampling ## 生成负样本 在常见的关系抽取应用中,我们经常需要生成负样本来训练一个好的系 ...