SQL语法集锦三:合并列值与分拆列值
本文转载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

执行结果如下图:
SQL语法集锦三:合并列值与分拆列值的更多相关文章
- 一个SQL查询连续三天的流量100以上的数据值【SQql Server】
题目 有一个商场,每日人流量信息被记录在这三列信息中:序号 (id).日期 (date). 人流量 (people).请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于10 ...
- SQL语法集锦一:SQL语句实现表的横向聚合
本文转载:http://www.cnblogs.com/lxblog/archive/2012/09/29/2708128.html 问题描述:假如有一表结构和数据如下: C1 C2 C3 C4 C5 ...
- SQL语法集锦一:显示每个类别最新更新的数据
本文转载http://www.cnblogs.com/lxblog/archive/2012/09/28/2707504.html (1)显示每个类别最新更新的数据 在项目中经常遇到求每个类别最新显示 ...
- mysql中SQL执行过程详解与用于预处理语句的SQL语法
mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...
- easyui 在编辑状态下,动态修改其他列值。
首先是自定义了一个方法uodateColumn更新列值 /** *自定义的修改列值方法 */ $.extend($.fn.datagrid.methods, { updateColumn: funct ...
- SQL 合并列值和拆分列值
合并列值 表结构,数据如下: id value ----- ------ aa bb aaa bbb ccc 需要得到结果: id values ------ ----------- aa,bb aa ...
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- sql中合并列方法
方法一:创建合并列函数 -------创建一个方法---------- CREATE FUNCTION dbo.Role_Name(@AdminID int) ) AS BEGIN ) SET @r ...
- sql语法值ORACLE简单介绍
版权声明:本文为[博主](https://zhangkn.github.io)原创文章,未经博主同意不得转载.https://creativecommons.org/licenses/by-nc-sa ...
随机推荐
- 理解ThreadLocal背后的概念
介绍 我之前在任何场合都没有使用过thread local,因此没有注意到它,直到最近用到它的时候. 前提信息 线程可以理解为一个单独的进程,它有自己的调用栈.在java中每一个线程都有一个调用栈或者 ...
- StringBuilder字符串拼接类
StringBuilder StringBuilder是在using System.Text命名空间下的一个成员. 在做字符串拼接的时候,因为字符串是引用类型,新的字符串是会再内存中创建的,所以用+号 ...
- Rendering Transparent 3D Surfaces in WPF with C#(转载)
Rendering Transparent 3D Surfaces in WPF with C# The primary problems that arise when rendering semi ...
- C# 仿迅雷风格选项卡
private void listView1_SelectedIndexChanged(object sender, EventArgs e) { listView1.FullRowSelect = ...
- C#反射(一) 【转】
在还不太熟悉反射的昨天,以为反射很神秘,在网上到处找答案.今天找了段代码敲了一下,茅塞顿开!其实反射也就那么简单的一回事! 反射是一种机制,通过这种机制我们可以知道一个未知类型的类型信息.比如, ...
- js代码判断浏览器种类IE、FF、Opera、Safari、chrome及版本
这篇文章主要分享了判断IE.FF.Opera.Safari.Chrome等浏览器和版本的两种方法,需要的朋友可以参考下 因为ie10-ie11的版本问题,不再支持document.all判断,所以ie ...
- 【UVA11019】Matrix Matcher
Description Given an N × M matrix, your task is to find the number of occurences of an X × Y pattern ...
- C++ Virtual详解(注意函数被隐藏的问题)
Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就 ...
- Array.asList()注意
api: public static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表.(对返回列表的更改会“直接写”到数组.)此方 ...
- Tomcat默认打开项目设置
Tomcat设置默认启动项目 Tomcat设置默认启动项目,顾名思义,就是让可以在浏览器的地址栏中输入ip:8080,就能访问到我们的项目.具体操作如下: 1.打开tomcat的安装根目录,找到Tom ...