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

数据库示例:

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 Server 行转列,列转行。多行转成一列

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

  2. hive Sql列转行使用explode的注意事项-null值处理

    hive Sql列转行使用explode的注意事项-null值处理 日常工作中,我们经常会用Lateral View 结合explode将数据炸裂,但是该方法对应explode的内容是有非null限制 ...

  3. mysql中如何将一个表中的部分记录合并,MySQL数据库将多条记录的单个字段合并成一条记录_MySQL...

    bitsCN.com MySQL数据库将多条记录的单个字段合并成一条记录 MySQL数据库将多条记录的单个字段合并成一条记录的操作是本文 我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧 ...

  4. 一对多查询,合并成一条数据

    一对多查询,合并成一条数据 举例:一个产品对应多个型号,把多个型号查询出来显示在一个字段下面.显示出一条数据. 步骤: 1:创建产品表: 2:创建型号表: 思路: 先写出不含产品型号的查询语句, 然后 ...

  5. MYSQL 单表一对多查询,将多条记录合并成一条记录

    MYSQL 单表一对多查询,将多条记录合并成一条记录 一.描述: 在MySQL 5.6环境下,应工作需求:将一个表中多条某个相同字段的其他字段合并(不太会表达,有点绕,直接上图) 想要达到的效果: 实 ...

  6. MySQL将多条数据合并成一条

    数据库中存的是多条数据,展示的时候需要合并成一条 数据表存储形式如下图 以type分组,type相同的算一条,且保留image和link的所有数据,用groupBy只保留一条数据 解决方案:用 GRO ...

  7. SQL 列转行、行转列 - 使用sqlite演示

    一 列转行 CREATE TABLE test1(ID INT PRIMARY KEY NOT NULL,NAME VARCHAR(50) NOT NULL,语文 INT,数学 INT,英语 INT ...

  8. SQL列转行及行转列

    --============================================== 作者:王运亮(wwwwgou) 时间:2011-06-10 博客:http://blog.csdn.n ...

  9. oracle sql列转行_ORACLE 列转行和行转列的SQL和函数

    本文介绍两种行.列转换方法,一种是常规的SQL,一种是ORACLE 11G提供的函数.下面使用一个小例子对这两种方法进行说明. ---------------------------------原始表 ...

最新文章

  1. word关闭未响应_大众途观全景天窗遮阳卷帘无法关闭
  2. 一些.net命令行工具的使用
  3. mysql 节点查根_(三)B数、B+树及在数据库索引中应用
  4. Mybatis学习之配置优化
  5. 0315互联网新闻 | 小红书测试短视频产品“hey”;华为与故宫共同打造“5G智慧故宫”...
  6. 强化学习4——无模型预测(蒙特卡洛法和TD法)
  7. boost::core模块实现交换std::bitset
  8. java获取xml参数
  9. python保存和加载数组
  10. 【Java】Java数据库访问体系重点总结
  11. 找树根和孩子(信息学奥赛一本通-T1336)
  12. C语言枚举类型(enum)的各种用法
  13. 【效率】专为Win7系统设计的极简番茄计时器 - MiniPomodoro (附源码)
  14. express 4.x 获取post提交的数据
  15. python数据分析的概念_Python数据分析入门篇
  16. 多源数据融合:大数据分析的瓶颈
  17. python灰色关联度分析代码_GRA灰色关联度分析学习 附python代码
  18. 域和工作组的概念以及区别
  19. nginx的max_fails的bug
  20. 黑马头条推荐系统完整版(包括虚拟机和数据,代码已修复过可完美跑起来)

热门文章

  1. OpenGL DoubleWrite的实例
  2. OpenGL Deferred Shading延迟阴影实例
  3. C++radix sort基数排序的实现算法之一(附完整源码)
  4. vector的实现原理
  5. C语言多维数组做函数参数退化原因大剖析
  6. 经典C语言程序100例之六六
  7. 经典C语言程序100例之二
  8. mybatis plus 事务管理器_[MyBatis]-02 环境搭建及配置文件详解
  9. java只有值传递_面试官:为什么 Java 中只有值传递?
  10. 「JupyterNotebook-bug」Jupyter Notebook卸载已安装的第三方库不能输入yes的问题