[在线求教]如何将一列的数据,根据某一列分组后,合并到一个列中

时间:2023-01-21 15:13:58
用语言可能描述的不够清楚,举例说明吧。
序号  课程编号      班级名称
1        010010        T1123-1
2        010020        T1123-1
3        010010        T1133-1
4        010020         T1153-1
用课程编号分组,将班级名称按照一定的顺序组合起来,形成如下的结果
010010          T1123-1,T1133-1
010020          T1123-1,T1153-1

11 个解决方案

#1


忘了说了,能用一条语句完成吗?

#2


mssql2005
SELECT 课程编号, 班级名称S=STUFF((SELECT ','+[班级名称] FROM table t WHERE  课程编号e=t1. 课程编号 FOR XML PATH('')), 1, 1, '')
FROM table t1
GROUP BY 课程编号

#3


select a.课程编号,
stuff((select ','+班级名称 from tb b 
       where b.课程编号=a.课程编号
       for xml path('')),1,1,'') '班级名称'
from tb a
group by  a.课程编号

#4


declare @galenkeny table(序号 int identity(1,1),课程编号 VARCHAR(10),班级名称 VARCHAR(10))
insert into @galenkeny
SELECT '010010', 'T1123-1' union all
select '010020', 'T1123-1' union all
select '010010', 'T1133-1' union all
SELECT '010020', 'T1153-1' 



select  b.课程编号,
        班级名称=STUFF((SELECT ','+班级名称 FROM @galenkeny a WHERE  b.课程编号=a.课程编号 FOR XML PATH('')),1,1,'')
        FROM  @galenkeny b
        GROUP BY b.课程编号

#5


引用 3 楼 DBA_Huangzj 的回复:
select a.课程编号,
stuff((select ','+班级名称 from tb b 
       where b.课程编号=a.课程编号
       for xml path('')),1,1,'') '班级名称'
from tb a
group by  a.课程编号




引用 2 楼 blandwolf 的回复:
mssql2005
SELECT 课程编号, 班级名称S=STUFF((SELECT ','+[班级名称] FROM table t WHERE  课程编号e=t1. 课程编号 FOR XML PATH('')), 1, 1, '')
FROM table t1
GROUP BY 课程编号


两位大神,这个功能我明白了,但还差一个,将班级名称按一定的顺序排序啊。这种方法可以排序不?

#6


上测试数据和结果

#7


引用 6 楼 blandwolf 的回复:
上测试数据和结果


我的意思是,可以不可以加order by 排序,因为上面的例子中
序号  课程编号      班级名称
1        010010        T1123-1
2        010020        T1123-1
3        010010        T1133-1
4        010020         T1153-1

假如我将第2行和第4行交换一下
1        010010        T1123-1
2        010020        T1153-1
3        010010        T1133-1
4        010020         T1123-1

如果还要形成
010010          T1123-1,T1133-1
010020          T1123-1,T1153-1
这样的,能在刚才那条语句中排序吗?

#8


引用 7 楼 yixian2007 的回复:
Quote: 引用 6 楼 blandwolf 的回复:

上测试数据和结果


我的意思是,可以不可以加order by 排序,因为上面的例子中
序号  课程编号      班级名称
1        010010        T1123-1
2        010020        T1123-1
3        010010        T1133-1
4        010020         T1153-1

假如我将第2行和第4行交换一下
1        010010        T1123-1
2        010020        T1153-1
3        010010        T1133-1
4        010020         T1123-1

如果还要形成
010010          T1123-1,T1133-1
010020          T1123-1,T1153-1
这样的,能在刚才那条语句中排序吗?

declare @galenkeny table(序号 int identity(1,1),课程编号 VARCHAR(10),班级名称 VARCHAR(10))
insert into @galenkeny
SELECT '010010', 'T1123-1' union all
select '010020', 'T1153-1' union all
select '010010', 'T1133-1' union all
SELECT '010020', 'T1123-1' 



select  b.课程编号,
        班级名称=STUFF((SELECT ','+班级名称 FROM @galenkeny a WHERE  b.课程编号=a.课程编号 ORDER by 班级名称 FOR XML PATH('')),1,1,'')
        FROM  @galenkeny b
        GROUP BY b.课程编号
       

#9


在FOR XML里面排序
SELECT 课程编号, 班级名称S=STUFF((SELECT ','+班级名称 FROM tb t WHERE  课程编号=t1.课程编号  ORDER BY 班级名称 FOR XML PATH('')), 1, 1, '')
FROM tb t1
GROUP BY 课程编号

#10



create table yx
(序号 int,课程编号 varchar(10),班级名称 varchar(10))

insert into yx
 select 1,'010010','T1123-1' union all
 select 2,'010020','T1153-1' union all
 select 3,'010010','T1133-1' union all
 select 4,'010020','T1123-1'


select a.课程编号,
       stuff((select ','+b.班级名称 
              from yx b 
              where b.课程编号=a.课程编号
              order by b.班级名称 
              for xml path('')),1,1,'') '班级名称'
 from yx a
 group by a.课程编号

/*
课程编号       班级名称
---------- -----------------------
010010     T1123-1,T1133-1
010020     T1123-1,T1153-1

(2 row(s) affected)
*/

#11


谢谢大家,结贴给分。

#1


忘了说了,能用一条语句完成吗?

#2


mssql2005
SELECT 课程编号, 班级名称S=STUFF((SELECT ','+[班级名称] FROM table t WHERE  课程编号e=t1. 课程编号 FOR XML PATH('')), 1, 1, '')
FROM table t1
GROUP BY 课程编号

#3


select a.课程编号,
stuff((select ','+班级名称 from tb b 
       where b.课程编号=a.课程编号
       for xml path('')),1,1,'') '班级名称'
from tb a
group by  a.课程编号

#4


declare @galenkeny table(序号 int identity(1,1),课程编号 VARCHAR(10),班级名称 VARCHAR(10))
insert into @galenkeny
SELECT '010010', 'T1123-1' union all
select '010020', 'T1123-1' union all
select '010010', 'T1133-1' union all
SELECT '010020', 'T1153-1' 



select  b.课程编号,
        班级名称=STUFF((SELECT ','+班级名称 FROM @galenkeny a WHERE  b.课程编号=a.课程编号 FOR XML PATH('')),1,1,'')
        FROM  @galenkeny b
        GROUP BY b.课程编号

#5


引用 3 楼 DBA_Huangzj 的回复:
select a.课程编号,
stuff((select ','+班级名称 from tb b 
       where b.课程编号=a.课程编号
       for xml path('')),1,1,'') '班级名称'
from tb a
group by  a.课程编号




引用 2 楼 blandwolf 的回复:
mssql2005
SELECT 课程编号, 班级名称S=STUFF((SELECT ','+[班级名称] FROM table t WHERE  课程编号e=t1. 课程编号 FOR XML PATH('')), 1, 1, '')
FROM table t1
GROUP BY 课程编号


两位大神,这个功能我明白了,但还差一个,将班级名称按一定的顺序排序啊。这种方法可以排序不?

#6


上测试数据和结果

#7


引用 6 楼 blandwolf 的回复:
上测试数据和结果


我的意思是,可以不可以加order by 排序,因为上面的例子中
序号  课程编号      班级名称
1        010010        T1123-1
2        010020        T1123-1
3        010010        T1133-1
4        010020         T1153-1

假如我将第2行和第4行交换一下
1        010010        T1123-1
2        010020        T1153-1
3        010010        T1133-1
4        010020         T1123-1

如果还要形成
010010          T1123-1,T1133-1
010020          T1123-1,T1153-1
这样的,能在刚才那条语句中排序吗?

#8


引用 7 楼 yixian2007 的回复:
Quote: 引用 6 楼 blandwolf 的回复:

上测试数据和结果


我的意思是,可以不可以加order by 排序,因为上面的例子中
序号  课程编号      班级名称
1        010010        T1123-1
2        010020        T1123-1
3        010010        T1133-1
4        010020         T1153-1

假如我将第2行和第4行交换一下
1        010010        T1123-1
2        010020        T1153-1
3        010010        T1133-1
4        010020         T1123-1

如果还要形成
010010          T1123-1,T1133-1
010020          T1123-1,T1153-1
这样的,能在刚才那条语句中排序吗?

declare @galenkeny table(序号 int identity(1,1),课程编号 VARCHAR(10),班级名称 VARCHAR(10))
insert into @galenkeny
SELECT '010010', 'T1123-1' union all
select '010020', 'T1153-1' union all
select '010010', 'T1133-1' union all
SELECT '010020', 'T1123-1' 



select  b.课程编号,
        班级名称=STUFF((SELECT ','+班级名称 FROM @galenkeny a WHERE  b.课程编号=a.课程编号 ORDER by 班级名称 FOR XML PATH('')),1,1,'')
        FROM  @galenkeny b
        GROUP BY b.课程编号
       

#9


在FOR XML里面排序
SELECT 课程编号, 班级名称S=STUFF((SELECT ','+班级名称 FROM tb t WHERE  课程编号=t1.课程编号  ORDER BY 班级名称 FOR XML PATH('')), 1, 1, '')
FROM tb t1
GROUP BY 课程编号

#10



create table yx
(序号 int,课程编号 varchar(10),班级名称 varchar(10))

insert into yx
 select 1,'010010','T1123-1' union all
 select 2,'010020','T1153-1' union all
 select 3,'010010','T1133-1' union all
 select 4,'010020','T1123-1'


select a.课程编号,
       stuff((select ','+b.班级名称 
              from yx b 
              where b.课程编号=a.课程编号
              order by b.班级名称 
              for xml path('')),1,1,'') '班级名称'
 from yx a
 group by a.课程编号

/*
课程编号       班级名称
---------- -----------------------
010010     T1123-1,T1133-1
010020     T1123-1,T1153-1

(2 row(s) affected)
*/

#11


谢谢大家,结贴给分。