如何写这个汇总表的SQL语句?
我有一张流水线记录的“定单”数据表,里面有(ID 、 姓 名 、预 定、数 量)等信息,想按姓名做一个汇总信息。
数据表信息记录例如:
ID 姓 名 预 定 数 量
1 张三 铅笔 23
2 李四 水笔 15
3 张三 毛笔 20
4 张三 水笔 33
5 李四 毛笔 22
6 王二 铅笔 44
我想使用SQL语句实现按姓名数据汇总并显示出来,中间使用 ", "号隔开格式如下:
姓 名 预 定 数 量
张三 铅笔,毛笔,水笔 23,20,33
李四 水笔,毛笔 15,22
王二 铅笔 44
求助:我该如何写这个SQL语句?
[解决办法]
--SQL2000的話,寫function比較好
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
end
GO
select [姓名],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
[解决办法]
create table 定单(ID int,姓名 varchar(10),预定 varchar(10),数量 int)
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, '王二 ', '铅笔 ',44
create 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
end
select distinct 姓名,dbo.uf_getstrs(姓名, '预定 ') as '预定 ',dbo.uf_getstrs(姓名, '数量 ') as '数量 '
from 定单
/*
李四水笔,毛笔15,22
王二铅笔44
张三铅笔,毛笔,水笔23,20,33
*/
[解决办法]
select distinct 姓名,dbo.uf_getstrs(姓名, '预定 ') as '预定 ',dbo.uf_getstrs(姓名, '数量 ') as '数量 '
into #临时表
from 定单
where 姓名= '张三 '