本文出处: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行合并成列与列拆分成行的更多相关文章

  1. MYSQL多行合并成一行多列

    ), VALUE )) INSERT INTO # VALUES (,,'), (,,'), (,,'), (,,'), (,,'), (,,'), (,,') SELECT code,MIN(nam ...

  2. ELK之使用filebeat的多行过滤插件把多行合并成一行

    java运行日志一般有多行,格式类似如下 格式为:日期 + 日志级别 + 日志信息 有些日志是多行的,需要使用filebeat多行插件把多行合并成一行 未使用多行插件的日志格式 修改filebeat配 ...

  3. logstash收集java日志,多行合并成一行

    使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input { ...

  4. mysql 行变列(多行变成一行/多行合并成一行/多行合并成多列/合并行)

    数据库结构如图: 而我想让同一个人的不同成绩变成此人在这一行不同列上显示出来,此时分为2中展现: 第一种展现如图----[多行变一列](合并后的数据在同一列上): sql如下: select name ...

  5. SQL查询多行合并成一行

    问题描述:无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,  所以,当我们在处理下列要求时,会比较麻烦:有表tb, 如下:id    value----- ---- ...

  6. SQL语句 分组 多行合并成一行

    ,,'')) FROM Table d GROUP by Id 另外: sql 单引号转义:两个单引号转义为一个单引号 set @sql='STUFF((SELECT '','' + Names FR ...

  7. sql多行合并成一行用逗号隔开,多表联合查询中子查询取名可重复

    简单版的 SELECT a.CreateBy,Name =stuff((select ','+Name FROM SG_Client WHERE CreateBy = a.CreateBy for x ...

  8. editplus多行合并成一行

    原文:https://www.cnblogs.com/jpfss/p/9238877.html Editplus 合并行快捷键: Ctrl+Shift+J     ,选中要合并的行,再按快捷键即可

  9. SQL行合并

    CREATE TABLE SC ( Student ), Course ) ) INSERT INTO SC SELECT N'张三',N'大学语文' UNION ALL SELECT N'李四',N ...

随机推荐

  1. 02-Sockent客户端

    package com.day1; import java.io.IOException; import java.io.OutputStream; import java.net.Inet4Addr ...

  2. Fragment onActivityResult提前响应,startActivityForResult执行后立即响应onActivityResult的解决方法

    找不到病根真是让人愁白了头: 今天写了一个startActivityForResult,开启一个Activity并拿到返回的结果,但是startActivityForResult刚走,onActivi ...

  3. solr 使用edismax来控制评分

    如何控制评分 如果设置了sort字段,那么将会按照sort字段的顺序返回结果. 如果没有设置sort字段,那么将会根据相关度打分来排序.也就是说,相关度更高的排在前面. 如何来定制适合自身业务的排序打 ...

  4. Echarts动态加载饼状图实例(二)

    一.引入echarts.js文件(下载页:http://echarts.baidu.com/download.html) 二.HTML代码: <div class="ui-contai ...

  5. SDOI2018IIIDX

    /* 题目转换为 n个节点的一片森林,n个权值,要给每个节点分配一个权值,保证子节点的权值不小于父节点的权值,并且1~n的权值的字典序最大. 考场上的贪心很显然 建立出 树来 将所有数值从大到小排序 ...

  6. POJ2311 Cutting Game 博弈 SG函数

    Cutting Game Description Urej loves to play various types of dull games. He usually asks other peopl ...

  7. 对于Servlet、Servlet容器以及一个Servlet容器-Tomcat

    Servlet.Servlet容器等内容讲解 转载自http://blog.csdn.net/iAm333 对于Servlet.Servlet容器以及一个Servlet容器-Tomcat这些概念讲解的 ...

  8. cat & 文件结束符

    语法: 连接显示 选项: -n,显示行号. -v,显示不可见打印符. -E,显示“行结束符”($). 显示行号 $ cat -n /etc/fstab /dev/VolGroup00/LogVol00 ...

  9. SAP work process Memory allocate

    Memory allocation sequence to dialog work processes in SAP What is the memory allocation sequence to ...

  10. 关于thinkphp中post提交空白的思考

    关于thinkphp中post提交空白的思考 首选检查 目标路径是否存在 如果目标URL不存在 那肯定是空 如果提交的路径存储  TP这种完善的系统肯定会提示 各种报错了