问题:假设有张表(tb)如下:
编号 姓名 选修课程
1 张三 语文
2 张三 数学
3 张三 物理
4 李四 语文
5 李四 数学
6 李四 化学
想变成(得到如下结果):
姓名 选修课程
---- ------------
李四 语文,数学,化学
张三 语文,数学,物理
-------------------
请问该怎么做呢?多谢
编号 姓名 选修课程
1 张三 语文
2 张三 数学
3 张三 物理
4 李四 语文
5 李四 数学
6 李四 化学
想变成(得到如下结果):
姓名 选修课程
---- ------------
李四 语文,数学,化学
张三 语文,数学,物理
-------------------
请问该怎么做呢?多谢
解决方案 »
- SQL动态查询字段输出页数
- 怎样不同类别下每隔4个记录就更改它们的type。分暂时只有20,有分再补
- 建立了一个存储过程,想动态对某个表进行操作,不想建动态SQL,那怎么做好?
- 关于修改表的 not null 时遇到的问题?
- 批量插入??
- 梁老师上次给了一个学生表的试题,现在想问一下有没有网站下载数据库的
- 我要这样学sql?谢谢!
- 行列转换碰到一条记录有字符出错的问题。帮我看看代码那里有问题。
- 求一个SQL的写法(单表)
- 送高分啊!请问聚集索引和非集聚索引有什么不同?
- SQL中的 output 和return如何使用
- 还是有问题.苦*行*僧来帮下忙.从 nvarchar 数据类型到 datetime 数据类型的转换产生一个超出范围的值
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+','+CAST(col2 as varchar)
FROM tb
WHERE col1=@col1
RETURN(STUFF(@re,1,1,''))
END
GO--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (编号 int,姓名 varchar(4),选修课程 varchar(4))
insert into #T
select 1,'张三','语文' union all
select 2,'张三','数学' union all
select 3,'张三','物理' union all
select 4,'李四','语文' union all
select 5,'李四','数学' union all
select 6,'李四','化学'-->(1) 2000: 不用函数的解决方案
declare @i int, @max int, @sql varchar(max)
select top 1 @i=1, @max=count(*) from #T group by 姓名 order by 2 desc
while @i<=@max
begin
set @sql=isnull(@sql+'+max(case i when '+ltrim(@i)+' then '',''+','max(case i when '+ltrim(@i)+' then ')+'选修课程 else '''' end)'
set @i=@i+1
end
exec ('select 姓名, 选修课程='+@sql+' from (select *,i=(select count(1) from #T where 姓名=a.姓名 and 选修课程<=a.选修课程) from #T a) t group by 姓名')
/*
姓名 选修课程
---- --------------
李四 化学,数学,语文
张三 数学,物理,语文
*/-->(2) 2005: 效率高可读性强
select 姓名, 选修课程=(stuff((select ','+选修课程 from #T where 姓名=a.姓名 for xml path('')),1,1,'')) from #T a group by 姓名
/*
姓名 选修课程
---- --------------
李四 语文,数学,化学
张三 语文,数学,物理
*/