SQL语法集锦三:合并列值与分拆列值

简介: 本文转载http://www.cnblogs.com/lxblog/archive/2012/09/29/2708724.html 在SQL中分拆列值和合并列值老生常谈了,从网上搜刮了一下并记录下来,以便不时之需 :)什么叫分拆列值和合并列值呢?就只是这样的,比如有如下表A结构及数据...

本文转载http://www.cnblogs.com/lxblog/archive/2012/09/29/2708724.html

 

在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 叫做合并列值。

一、分拆列值:

复制代码
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)

复制代码
--方法一:适用于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及以上版本)

复制代码
--方法二:适用于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 
复制代码

执行结果如下图:

二、合并列值:

复制代码
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 版本,只能用函数的方式来实现)

复制代码
--方法一(适用于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及其以后版本)

--方法二(适用于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 

执行结果如下图:

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

复制代码
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
复制代码

执行结果如下图:

目录
相关文章
|
29天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
2月前
|
SQL 存储 关系型数据库
SQL `CREATE DATABASE` 语法
【11月更文挑战第10天】
79 3
|
2月前
|
SQL 关系型数据库 数据库
sql语法
【10月更文挑战第26天】sql语法
46 5
|
3月前
|
SQL 数据库
SQL数据库基础语法入门
[link](http://www.vvo.net.cn/post/082935.html)
|
3月前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
60 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql(2)—SQL语法详解
SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发,旨在处理关系数据模型。
48 0
|
5月前
|
SQL 关系型数据库 MySQL
INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
【8月更文挑战第7天】INSERT INTO t_a.tableName SELECT * FROM t_b.tableName 如何通过定义一个list对象,包含多个tableName,循环执行前面的sql,用MySQL的语法写
62 5
|
6月前
|
SQL 关系型数据库 数据库
sql语法
【7月更文挑战第30天】sql语法
61 12
|
5月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
642 0
|
6月前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之遇到SQL语法错误,该如何排查
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。