我有一张流水线记录的“定单”数据表,里面有(ID 、 姓 名 、预 定、数 量)等信息,想按姓名做一个汇总信息。
数据表信息记录例如:
ID 姓 名 预 定 数 量
1 张三 铅笔 23
2 李四 水笔 15
3 张三 毛笔 20
4 张三 水笔 33
5 李四 毛笔 22
6 王二 铅笔 44我想使用SQL语句实现按姓名数据汇总并显示出来,中间使用","号隔开格式如下: 姓 名 预 定 数 量
张三 铅笔,毛笔,水笔 23,20,33
李四 水笔,毛笔 15,22
王二 铅笔 44求助:我该如何写这个SQL语句?
数据表信息记录例如:
ID 姓 名 预 定 数 量
1 张三 铅笔 23
2 李四 水笔 15
3 张三 毛笔 20
4 张三 水笔 33
5 李四 毛笔 22
6 王二 铅笔 44我想使用SQL语句实现按姓名数据汇总并显示出来,中间使用","号隔开格式如下: 姓 名 预 定 数 量
张三 铅笔,毛笔,水笔 23,20,33
李四 水笔,毛笔 15,22
王二 铅笔 44求助:我该如何写这个SQL语句?
GO
create function fn_test(@name varchar(20),@flag int)
returns varchar(100)
AS
begin
declare @str varchar(100)
set @str=''
if @flag=1
begin
select @str=@str+','+[预定] from T where [姓名] =@name
end
if @flag=2
begin
select @str=@str+','+rtrim([数量]) from T where [姓名] =@name
end
if len(@str)>0
set @str=stuff(@str,1,1,'')
return @str
endGOselect [姓名],dbo.fn_test( [姓名],1) as [预定],dbo.fn_test( [姓名],2) as [数量]
from T
group by [姓名]
---------------------------------------------------------------------
--生成测试数据
create table 表(部门 int,人员 varchar(20))
insert into 表 select 1,'张三'
insert into 表 select 1,'李四'
insert into 表 select 1,'王五'
insert into 表 select 2,'赵六'
insert into 表 select 2,'邓七'
insert into 表 select 2,'刘八'
go--创建用户定义函数
create function f_str(@department int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+人员 from 表 where 部门 = @department
set @ret = stuff(@ret,1,1,'')
return @ret
end
go
--执行
select 部门,人员=dbo.f_str(部门) from 表 group by 部门 order by 部门
go--输出结果
/*
部门 人员
---- --------------
1 张三,李四,王五
2 赵六,邓七,刘八
*/
--删除测试数据
drop function f_str
drop table 表
go
insert into 定单
select 1,'张三','铅笔',23
union all select 2,'李四','水笔',15
union all select 3,'张三','毛笔',20
union all select 4,'张三','水笔',33
union all select 5,'李四','毛笔',22
union all select 6,'王二','铅笔',44create function uf_getstrs(@姓名 varchar(10),@type varchar(10))
returns varchar(8000)
as
begin
declare @strs varchar(8000)
select @strs=''
select @strs=@strs+case when @type='预定' then 预定+',' when @type='数量' then rtrim(数量)+',' end
from 定单
where 姓名=@姓名
set @strs=left(@strs,len(@strs)-1)
return @strs
endselect distinct 姓名,dbo.uf_getstrs(姓名,'预定') as '预定',dbo.uf_getstrs(姓名,'数量') as '数量'
from 定单/*
李四 水笔,毛笔 15,22
王二 铅笔 44
张三 铅笔,毛笔,水笔 23,20,33
*/
into #临时表
from 定单
where 姓名='张三'