前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >(3)合并列值与分拆列值

(3)合并列值与分拆列值

作者头像
跟着阿笨一起玩NET
发布于 2018-09-18 09:49:09
发布于 2018-09-18 09:49:09
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

在SQL中分拆列值和合并列值老生常谈了,从网上搜刮了一下并记录下来,以便不时之需 :)

什么叫分拆列值和合并列值呢?就只是这样的,比如有如下表A结构及数据:

Id

Data

1

aa,bb

2

aaa,bbb,ccc

将该表A的Data字段数据根据 “,” 进行分拆得到如下表B

Id

Data

1

aa

1

bb

2

aaa

2

bbb

2

ccc

这就是表A-->表B 叫做分拆列值,表B-->表A 叫做合并列值。

一、分拆列值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE t_Demo1
(
  Id INT,
  Data VARCHAR(30)
)
GO

INSERT INTO t_Demo1 VALUES(1,'aa,bb') 
INSERT INTO t_Demo1 VALUES(2,'aaa,bbb,ccc')

 分拆方法一:(古老方法,适合于SQL 2000)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--方法一:适用于SQL 2000
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO #t FROM syscolumns a, syscolumns b

SELECT A.Id, SUBSTRING(A.Data, B.Id, CHARINDEX(',', A.Data + ',', B.Id) - B.Id) AS Data
FROM t_Demo1 as A, #t as B 
WHERE SUBSTRING(',' + A.Data, B.Id, 1) = ',' 

DROP TABLE #t

 分拆方法二:(适合于SQL2005及以上版本)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--方法二:适用于SQL 2005及之后版本
SELECT A.Id, B.Data 
FROM( 
    SELECT Id, Data = CONVERT(xml,' <root> <v>' + REPLACE(Data, ',', ' </v> <v>') + ' </v> </root>') FROM t_Demo1 
)A 
OUTER APPLY( 
    SELECT Data = N.v.value('.', 'varchar(100)') FROM A.Data.nodes('/root/v') N(v) 
)B 

 执行结果如下图:

二、合并列值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REATE TABLE t_Demo2
(
  Id INT,
  Data VARCHAR(30)
)
GO
INSERT INTO t_Demo2 VALUES(1, 'aa') 
INSERT INTO t_Demo2 VALUES(1, 'bb') 
INSERT INTO t_Demo2 VALUES(2, 'aaa') 
INSERT INTO t_Demo2 VALUES(2, 'bbb') 
INSERT INTO t_Demo2 VALUES(2, 'ccc') 

合并方法一:(适用于SQL2000 版本,只能用函数的方式来实现)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--方法一(适用于SQL2000 版本只能用函数的方式来实现):
CREATE FUNCTION dbo.Fun_GetStr(@id INT) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 
 DECLARE @r VARCHAR(8000) 
 SET @r = '' 
 SELECT @r = @r + ',' + CAST(Data AS VARCHAR) FROM t_Demo2 WHERE id=@id 
 SET @r=STUFF(@r, 1, 1, '')
 --或者
 --SET @r=RIGHT(@r , len(@r) - 1) 
 RETURN @r
END 
GO
--使用该函数
SELECT Id, Data = dbo.Fun_GetStr(Id) FROM t_Demo2 GROUP BY Id
--或者
SELECT DISTINCT Id ,dbo.Fun_GetStr(Id) AS Data FROM t_Demo2 
--删除该函数
DROP FUNCTION dbo.Fun_GetStr
GO

 合并方法二:(适用于SQL2005及其以后版本)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--方法二(适用于SQL2005及其以后版本)
SELECT Id, Data=STUFF((SELECT ','+ Data FROM t_Demo2 AS t WHERE Id=t_Demo2.Id FOR XML PATH('')), 1, 1, '') 
FROM t_Demo2 
GROUP BY Id 

 执行结果如下图:

三、合并列值并使用聚合函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE t_Price
(
  Id INT,
  Salary FLOAT, 
  Name NVARCHAR(10)
)
GO

INSERT INTO t_Price VALUES(1,10,'小明')
INSERT INTO t_Price VALUES(1,20,'小红')
INSERT INTO t_Price VALUES(2,50,'小兰')
INSERT INTO t_Price VALUES(2,100,'小七')
GO

--方法一:(利用函数)
CREATE FUNCTION Fun_HbStr(@id int)
 RETURNS NVARCHAR(100)
AS
BEGIN
    DECLARE @s NVARCHAR(100)
    SELECT @s=ISNULL(@s+',','')+ CAST(Name AS NVARCHAR) FROM t_Price where id=@id
    RETURN @s
END
GO
SELECT Id ,SUM(Salary) AS Salary,dbo.Fun_HbStr(Id) AS Data FROM t_Price GROUP BY Id
--删除函数
DROP FUNCTION Fun_HbStr
GO
--方法二:
SELECT Id, SUM(Salary) AS Salary,name=STUFF((SELECT ','+ Name FROM t_Price AS t WHERE Id=t_Price.Id FOR XML PATH('')), 1, 1, '') 
FROM t_Price 
GROUP BY Id 

--删除表 t_Price
DROP TABLE t_Price
GO

 执行结果如下图:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Sql Server:多行合并成一行,并做分组统计
--创建 test 表 ,插入数据   CREATE TABLE test(code varchar(50), [values] varchar(10),[count] int) INSERT test SELECT '001', 'aa',1 UNION ALL SELECT '001', 'bb',2 UNION ALL SELECT '002', 'aaa',4 UNION ALL SELECT '002', 'bbb',5 UNION ALL SELECT '002', 'ccc',3;      
跟着阿笨一起玩NET
2018/09/18
4.3K0
[sql server] 合并字符串
本文转载:http://blog.csdn.net/leamonjxl/article/details/7042317
跟着阿笨一起玩NET
2018/09/18
1.4K0
MySQL(三)|《千万级大数据查询优化》第一篇:创建高性能的索引
MySQL优化一般是需要索引优化、查询优化、库表结构优化三驾马车齐头并进。 可以说,索引优化是对查询性能优化最有效的手段,索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能要好几个数量级。创建一个真正“最优”的索引经常需要重写查询,所以索引优化和查询优化的关系很紧密。 本文是《千万级大数据查询优化》系列第一篇:创建高性能的索引。 我们先从一个面试题开始。 面试题: 如果有四条sql语句,查询条件分别是 where A=1 and B=1 and C=1. where
黄小怪
2018/05/21
1.4K0
SQL SERVER使用STUFF函数拼接记录为逗号分隔符
注意:本文内容太多,公众号有字数限制,全文可点击文末的阅读原文,谢谢大家的理解。Oracle培训和认证记得找小麦苗哟。
AiDBA宝典
2019/09/30
3.9K0
SQL SERVER使用STUFF函数拼接记录为逗号分隔符
关于数据质量脚本自动化处理V2.0
一个良好的数据质量规则引擎必然是可配置的,可开发的,可定时执行的,前一个版本是写死在代码中的,友好性比较差,再则缺乏判断会导致重复执行问题,2.0在前面基础上增加了容错机制,增加了可配置性。再有甚者,还可以写个前端页面做质量规则配置,写个定时任务配置等等。
python与大数据分析
2022/03/11
3470
关于数据质量脚本自动化处理V2.0
Enterprise Library 4.1学习笔记7----缓存应用程序块之SqlDependency
本文是在Artech“[原创]Enterprise Library深入解析与灵活应用(2): 通过SqlDependency实现Cache和Database的同步”的基础之上,将其示例移植到webform环境中而已,详细原理还请大家见Artech的文章  应用场景:利用Enlib4.1的缓存模块,实现常用数据的缓存,同时借助SqlDependency通过"监控数据是否有改动"来决定缓存是不是过期。 1.测试数据表及数据(sql2005环境) Code CREATE TABLE [dbo].[Messag
菩提树下的杨过
2018/01/23
6010
SQLServer CTE 递归查询
在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询,递归查询主要用于层次结构的查询,从叶级(Leaf Level)向顶层(Root Level)查询,或从顶层向叶级查询,或递归的路径(Path)。
挽风
2021/04/13
1.8K0
SQLServer CTE 递归查询
MySQL 8.0索引合并 - 优化器如何处理OR条件查询?
在MySQL 8.0中,优化器对OR条件查询的处理逻辑有了显著的改进,特别是在索引合并方面。
贺春旸的技术博客
2025/01/03
1790
Mssql高级注入笔记
暴库特殊技巧::%5c='\' 或者把/和\ 修改%5提交 and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype='U') 得到表名 and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype='U' and name
赵腰静
2018/03/09
1.6K0
不用 UNION 操作符实现 UNION 的效果
当我们要合并两个表或者多个表的结果时,可使用 UNION ALL 或者 UNION 操作符, UNION 和 UNION ALL 的区别在于前者会对结果集去重,而后者不会。
白日梦想家
2020/07/17
1.2K0
SQL 将一个字段内用逗号分隔的内容分成多条记录
本文转http://www.mhzg.net/a/20117/2011789260293.html
跟着阿笨一起玩NET
2018/09/18
4.7K0
数据库:分享四个实用的SQLServer脚本函数,欢迎收藏
功能:主要适用于数据库字段存储字段用逗号等分隔符存储,可以转换为list然后用子查询使用。
小明互联网技术分享社区
2021/02/26
5300
数据库SQL小技巧大揭秘:IGNORE选项让你的数据处理更从容
在 MySQL 中,IGNORE 是一种在插入或更新数据时处理冲突的选项。具体来说,在 INSERT | UPDATE 语句中,IGNORE 的作用是在插入或更新数据时忽略特定的错误,而不导致整个操作失败。另外,IGNORE 选项还可以在非空约束、写入的字段内容超过字段长度时进行截断处理等,下面是几个具体的例子。
俊才
2023/11/30
5340
数据库SQL小技巧大揭秘:IGNORE选项让你的数据处理更从容
SQL Server 最小化日志操作解析,应用
概念:SQL Server在满足相应条件的基础上时进行一些特定的操作如Rebuild Index时会进行最小化Tran Log记录操作,从而改善系统性能.
全栈程序员站长
2022/07/20
6120
SQL Server 最小化日志操作解析,应用
SQL基础用法(实例一)
1 /* 2 3 4 2006年10月01日 5 6 SQL Server 数据库的基本操作 7 (1) 数据库的创建 8 (2) 数据表的创建以及相关约束的指定(含临时表) 9 (3) 数据的添/删/改 10 (4) 数据的查询 11 12 */ 13 14 (0)创建数据库 15 -- 指定数据库名称 16 -- (注:如果数据库名中包含空格可以使用[]将其标示) 17 create database [Super WC] 18 -- 关于
用户1112962
2018/07/03
9720
OB 运维 | 一个关于 NOT IN 子查询的 SQL 优化案例
前段时间碰到一个慢 SQL,NOT IN 子查询被优化器改写成了 NESTED-LOOP ANTI JOIN,但是被驱动表全表扫描无法使用索引,执行耗时 16 秒。SQL 如下:
爱可生开源社区
2024/04/11
2030
OB 运维 | 一个关于 NOT IN 子查询的 SQL 优化案例
《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)
  所谓透视(Pivoting)就是把数据从行的状态旋转为列的状态的处理。其处理步骤为:
Edison Zhou
2018/08/20
9.2K0
《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)
SQL基础用法(实例二)
1 /* 2 3 4 2006年10月01日 5 6 SQL Server 数据库的高级操作 7 (1) 批处理 8 (2) 变量 9 (3) 逻辑控制 10 (4) 视图 11 (5) 函数 12 (6) 高级查询 13 14 */ 15 16 (1)批处理 17 将多条SQL语句作为一个整体去编译,生成一个执行计划,然后,执行! 18 理解批处理的关键在于"编译",对于由多条语句组成的一个批处理, 1
用户1112962
2018/07/04
8090
SQL常用数据库结构升级语句
修改视图 --SQL Server 2005 GO IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[e_myWorkflowProcessModule]')) DROP VIEW [dbo].[e_myWorkflowProcessModule] GO CREATE VIEW [dbo].[e_myWorkflowProcessModule] AS -------- GO 修改存储过程 --S
欢醉
2018/01/22
9220
SQL语句使用总结(一)
1>. FROM 2>. WHERE 3>. GROUP BY 4>. HAVING 5>. SELECT 6>. ORDER BY
跟着阿笨一起玩NET
2018/09/18
9920
SQL语句使用总结(一)
推荐阅读
相关推荐
Sql Server:多行合并成一行,并做分组统计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验