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 [email protected]
    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 [email protected]
--变成
SELECT @str = concat(@str,‘,‘,town) FROM t2 WHERE [email protected] 

其他代码不变

三、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就可以了,见三。

时间: 2024-10-10 22:34:53

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

MySQL合并列,集合中某个字段合并成一条

默认查询: SELECT floor,place_code FROM ticket; 合并列: SELECT concat(floor,',',place_code) floor FROM ticket; 合并成一条: SELECT group_concat(floor) floor FROM ticket;

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

1.正常情况. SELECT JoinEventIds from user 2.使用group_concat函数得到列转行. select group_concat(JoinEventIds) from user 3.使用SUBSTRING_INDEX和CROSS JOIN将列里面的的数字都拆分出来,把一行变成一列. 方法一(网上查询的方法): 建配置表: CREATE TABLE digits (digit INT(1)); INSERT INTO digits VALUES (0), (1)

sql列转行查询

test表: 执行列转行sql: select student, sum(case Course when '语文' then Score else null end) 语文, sum(case Course when '数学' then Score else null end) 数学, sum(case Course when '英语' then Score else null end) 英语 from test group by student 得到结果:

Sql 查询邮件地址多行合并一行,再发送邮件

--创建测试表 use Fly go IF OBJECT_ID('test') IS NOT NULL DROP TABLE test CREATE TABLE test( Id int IDENTITY(1,1) NOT NULL, Name varchar(50) NULL, Judge char(1) NULL, Mail varchar(50) NULL ) GO --插入测试数据 INSERT INTO test ( Name ,Judge ,Mail) SELECT '张三','Y'

Oracle 字段拆分替换在合并成一条

看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop table col_split; create table col_split ( var_id varchar2(6), var_value varchar2(80) ); 1--insert into col_split values('101001','spt001,spt2,spt3,sp

SQL列转行

典型实例 一.行转列 1.建立表格 IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb go CREATE TABLE tb(姓名 VARCHAR(10),课程 VARCHAR(10),分数 INT) insert into tb VALUES ('张三','语文',74) insert into tb VALUES ('张三','数学',83) insert into tb VALUES ('张三','物理',93) insert into tb VALU

Sql 列转行 三种方法对比

合并列值 --******************************************************************************************* 表结构,数据如下: id    value ----- ------ 1    aa 1    bb 2    aaa 2    bbb 2    ccc 需要得到结果: id    values ------ ----------- 1      aa,bb 2      aaa,bbb,ccc 即

SQL 列转行

普通行列转换 (爱新觉罗.毓华 2007-11-18于海南三亚) 假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 */ /* 想变成 姓名 语文 数学 物理 李四 74 84 94 张三 74 83 93 */ create table tb ( Name varchar(10) , Subject varchar(10) , Result int ) inser

sql 列转行 实例

select * from dbo.orders  group by  custid  with cube    select custid ,row_number() over(order by empid) as number from  orders    select count(*) from orders where empid >'5' and orderid in ('10248','10249')    drop table test  create table test(id