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 ...
随机推荐
- 02-Sockent客户端
package com.day1; import java.io.IOException; import java.io.OutputStream; import java.net.Inet4Addr ...
- Fragment onActivityResult提前响应,startActivityForResult执行后立即响应onActivityResult的解决方法
找不到病根真是让人愁白了头: 今天写了一个startActivityForResult,开启一个Activity并拿到返回的结果,但是startActivityForResult刚走,onActivi ...
- solr 使用edismax来控制评分
如何控制评分 如果设置了sort字段,那么将会按照sort字段的顺序返回结果. 如果没有设置sort字段,那么将会根据相关度打分来排序.也就是说,相关度更高的排在前面. 如何来定制适合自身业务的排序打 ...
- Echarts动态加载饼状图实例(二)
一.引入echarts.js文件(下载页:http://echarts.baidu.com/download.html) 二.HTML代码: <div class="ui-contai ...
- SDOI2018IIIDX
/* 题目转换为 n个节点的一片森林,n个权值,要给每个节点分配一个权值,保证子节点的权值不小于父节点的权值,并且1~n的权值的字典序最大. 考场上的贪心很显然 建立出 树来 将所有数值从大到小排序 ...
- POJ2311 Cutting Game 博弈 SG函数
Cutting Game Description Urej loves to play various types of dull games. He usually asks other peopl ...
- 对于Servlet、Servlet容器以及一个Servlet容器-Tomcat
Servlet.Servlet容器等内容讲解 转载自http://blog.csdn.net/iAm333 对于Servlet.Servlet容器以及一个Servlet容器-Tomcat这些概念讲解的 ...
- cat & 文件结束符
语法: 连接显示 选项: -n,显示行号. -v,显示不可见打印符. -E,显示“行结束符”($). 显示行号 $ cat -n /etc/fstab /dev/VolGroup00/LogVol00 ...
- SAP work process Memory allocate
Memory allocation sequence to dialog work processes in SAP What is the memory allocation sequence to ...
- 关于thinkphp中post提交空白的思考
关于thinkphp中post提交空白的思考 首选检查 目标路径是否存在 如果目标URL不存在 那肯定是空 如果提交的路径存储 TP这种完善的系统肯定会提示 各种报错了