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

数据库示例:

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 列转行,即多行合并成一条的更多相关文章
- SQL 列转行 分组去重并合并多条记录
继上篇<SQL 列转行 合并多条记录>后,有网友反馈新的需求还是不太会用. 现举例说明 一,网友需要如下的效果: 其实,这个需求依然可以我上篇的方法进行解答,但为了实现分组,需要disti ...
- SQL Server 行转列,列转行。多行转成一列
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name , value = ( STUFF(( SELECT ',' + va ...
- sqlserver中 多条数据合并成一条数据 (stuff 与 for xml path 连用)
SQL 列转行,即多行合并成一条 需求:按照分组,将多条记录内容合并成一条,效果如下: 数据库示例: CREATE TABLE [t2]([NID] [bigint] NULL,[district ...
- SQL列转行,行转列实现
在工作中,大家可能会遇到一些SQL列转行.行转列的问题,恰好,我也遇到了,就在此记录一下.此处所用的是SQLServer2008R2. 行转列,列转行,都要预先知道要要处理多少数据,在此我就以三种方案 ...
- MySQL把多个字段合并成一条记录的方法
转:http://www.111cn.net/database/mysql/71591.htm MySQL把多个字段合并成一条记录的方法 在mysql中字段合并可以使用很多函数来实现,如可以利用 GR ...
- SQL 列转行的实现
--列转行,逗号拼接指定列的值Oracle中写法:select wmsys.wm_concat(Field1) from TableASQL Server中写法:SELECT STUFF(( SELE ...
- Mysql group_concat函数列转行,与行转列
例一: SELECT num from user 1.使用group_concat函数得到列转行 select group_concat(num) from user 2.使用SUBSTRING_IN ...
- sql列转行查询
test表: 执行列转行sql: select student, sum(case Course when '语文' then Score else null end) 语文, sum(case Co ...
- Sql 列转行字符串
select OrderID,ProdDetailID from A 表A : OrderID,ProdDetailID 1 6 1 7 1 ...
随机推荐
- android studio 解决avd启动问题 ----waiting for target device come online
android studio 模拟器打不开,一直停留在第三方.waiting for target device come online 问题解决方法 方法1.Android Emulator 未 ...
- SQLSERVER 2008 编辑所有或者任意行
选中表 右键选择“编辑前200行”,然后选择左上角的 sql图标,然后在右侧的SQL语句去掉 top 200 然后执行查询 就可以编辑所有的行了,可以选择自己需要写SQL,然后查询编辑. 第二种方法: ...
- python类、类继承
yield: 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab( ...
- Spring整合JDBC以及AOP管理事务
本节内容: Spring整合JDBC Spring中的AOP管理事务 一.Spring整合JDBC Spring框架永远是一个容器,Spring整合JDBC其实就是Spring提供了一个对象,这个对象 ...
- input文本框 输入限制三则
其一,只允许输入数字和小数点. <input onKeypress="return (/[\d.]/.test(String.fromCharCode(event.keyCode))) ...
- easyui tree tabs
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【LOJ】#2384. 「HNOI2013」切糕
题解 神仙网络流啊-- naive的我一直想把每个纵轴拆点,每个纵轴建R个点(大概是要跑费用流吧--)--然后第二个限制就gg了,什么也想不出来,菜啊TAT 后来我发现大神们的建图都是,一个原点,一个 ...
- LoadRunner中log的使用总结
LoadRunner中log的使用总结 1.log的设置方式. 在 runtime setting中可以设置log的生成方式: 默认的log方式: Enable logging选中,log optio ...
- 安卓webview断网处理
需求:webview在加载的时候如果网络断开,会显示默认的错误界面,长得很丑,需要单独写一个页面,在网路出错的时候显示,点击重试以后重新加载网页 乍看挺简单的需求,但在实际过程中页碰到了不少坑,主要是 ...
- properties中的编码如何生成:例如\u7AD9\u70B9这种
在eclipse中的properties中的一种编码,例如\u7AD9\u70B9,是如何自动生成的. 这种编码方式当你要增加某个字段的时候,也要相应的添加这种编码方式下的格式,具体方法如下: