需求:按照分组,将多条记录内容合并成一条,效果如下:

数据库示例:

CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) NULL,[town] [nvarchar](255) NULL);
insert into t2 values(1,'淮上区','曹老集镇');
insert into t2 values(2,'淮上区','淮滨街道');
insert into t2 values(3,'淮上区','梅桥乡');
insert into t2 values(4,'淮上区','吴小街镇');
insert into t2 values(5,'淮上区','小蚌埠镇');
insert into t2 values(1,'光明新区','公明街道');
insert into t2 values(2,'光明新区','光明街道');
insert into t2 values(1,'吉利区','大庆路街道');
insert into t2 values(2,'吉利区','吉利乡');

根据不同的SQL版本,可以有以下方法:

一、SQL 2000 不支持FOR XML,不支持CONCAT。只能写自定义函数。

CREATE FUNCTION dbo.townconcat(@district nvarchar(255))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + town FROM t2 WHERE district=@district
RETURN STUFF(@str, 1, 1, '')
END
GO
-- 调用函数
SELECt district, town = dbo.townconcat(district) FROM t2 GROUP BY district drop function dbo.townconcat
go

二、SQL 2012 支持 concat,2000版本自定义函数的基础上可少量优化

--将2000版中的
SELECT @str = @str + ',' + town FROM t2 WHERE district=@district
--变成
SELECT @str = concat(@str,',',town) FROM t2 WHERE district=@district 其他代码不变

三、SQL2005支持for xml,可以大量简化

select distinct a.district,
(SELECT town+','FROM t2 where district=a.district FOR XML PATH(''))as towns
from t2 a

以上三种方法都可以实现同样的效果。效果第一段的需求中的效果。

四、分析:
以上3种方法各有优劣,个人喜欢for xml的方式,因为够简单,一条select解决,可以直接适用于各视图中。

核心的代码是:

SELECT town+','FROM t2  FOR XML PATH('')

上面的代码得到的结果为:

注:
1、上图中的列名是自动生成的,不可以通过as 来命名。
2、我们不可以select多列,比如SELECT district,town+',' as tt FROM t2  FOR XML PATH('')。

如果加上,并不会报错,但效果可能不是我们想要的,如下图:

那我们如何根据关键字段来分组呢,我们可以把(select ..FOR XML..)作为子查询生成字段,看下图:

得到上图就明白了吧,直接用distinct就可以了,见三。

SQL 列转行,即多行合并成一条的更多相关文章

  1. SQL 列转行 分组去重并合并多条记录

    继上篇<SQL 列转行 合并多条记录>后,有网友反馈新的需求还是不太会用. 现举例说明 一,网友需要如下的效果: 其实,这个需求依然可以我上篇的方法进行解答,但为了实现分组,需要disti ...

  2. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + va ...

  3. sqlserver中 多条数据合并成一条数据 (stuff 与 for xml path 连用)

    SQL 列转行,即多行合并成一条   需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district ...

  4. SQL列转行,行转列实现

    在工作中,大家可能会遇到一些SQL列转行.行转列的问题,恰好,我也遇到了,就在此记录一下.此处所用的是SQLServer2008R2. 行转列,列转行,都要预先知道要要处理多少数据,在此我就以三种方案 ...

  5. MySQL把多个字段合并成一条记录的方法

    转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...

  6. SQL 列转行的实现

    --列转行,逗号拼接指定列的值Oracle中写法:select wmsys.wm_concat(Field1) from TableASQL Server中写法:SELECT STUFF(( SELE ...

  7. Mysql group_concat函数列转行,与行转列

    例一: SELECT num from user 1.使用group_concat函数得到列转行 select group_concat(num) from user 2.使用SUBSTRING_IN ...

  8. sql列转行查询

    test表: 执行列转行sql: select student, sum(case Course when '语文' then Score else null end) 语文, sum(case Co ...

  9. Sql 列转行字符串

    select OrderID,ProdDetailID from A 表A : OrderID,ProdDetailID 1             6 1             7 1       ...

随机推荐

  1. collection.toArray(new String[0])中new String[0]的作用

    new string[0]的作用 比如:String[] result = set.toArray(new String[0]); Collection的公有方法中,toArray()是比较重要的一个 ...

  2. 洛谷P1301 魔鬼之城

    传送门啦 一道广度优先搜索的题目. 结构体含义: struct node{ int x,y,dir;//坐标,方向 int step;//当前步数 }; 方向的标号受上面定义的 $ dx[ ] , d ...

  3. 获取矩形局域的方法,Rect、Bounds、Point

    获取一个点和矩形区域的方法如下: var R: TRect; procedure TForm5.FormCreate(Sender: TObject); begin RadioGroup1.Items ...

  4. algorithm之unique

    #include<iostream> #include<algorithm> usingnamespace std; /**< unique函数的算法思想 */ vect ...

  5. SQL语句添加删除修改字段[sql server 2000/2005]

    用SQL语句添加删除修改字段1.增加字段     alter table docdsp    add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME ...

  6. 20155309南皓芯2016-2017 2《Java程序设计》第一周学习总结

    关于java学习笔记的思考问题 第一章:JDK与JRE,JVM之间有没有必然的联系 第二章:可执行文件夹找到相关链接库 第三章:for与while循环的用法与比较,break与continue跳出的注 ...

  7. #JS 异步处理机制的几种方式

    Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推) ...

  8. 002 使用Appender扩展logger框架

    这个地方,在看公司的源代码的时候,写的知识点: 现在再看,竟然不是太懂,重新写一份新的文档,外加示例说明. 一:说明 1.log4j 环境的三个主要组件: logger(日志记录器):控制要启用或禁用 ...

  9. java 代码中设置 临时 环境变量

    System.setProperty("hadoop.home.dir", "D:\\software\\software_install\\dev_install\\h ...

  10. maven设计思想

    20171108 maven设计思想? archetype  插件  学习插件.