我有一张流水线记录的“定单”数据表,里面有(ID 、 姓  名 、预   定、数   量)等信息,想按姓名做一个汇总信息。
数据表信息记录例如:
   ID     姓  名     预   定     数   量
   1       张三       铅笔        23
   2       李四       水笔        15
   3       张三       毛笔        20
   4       张三       水笔        33
   5       李四       毛笔        22
   6       王二       铅笔        44我想使用SQL语句实现按姓名数据汇总并显示出来,中间使用","号隔开格式如下:    姓  名     预   定                  数   量
     张三     铅笔,毛笔,水笔        23,20,33
     李四     水笔,毛笔              15,22
     王二     铅笔                    44求助:我该如何写这个SQL语句?

解决方案 »

  1.   

    --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
    endGOselect  [姓名],dbo.fn_test( [姓名],1) as [预定],dbo.fn_test( [姓名],2) as [数量]
    from T
    group by [姓名]
      

  2.   

    借助用户定义函数:
    ---------------------------------------------------------------------
    --生成测试数据
    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
      

  3.   

    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,'王二','铅笔',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
    */
      

  4.   

    可否使用select into #临时表 from 定单 where 姓名=    实现?
      

  5.   

    select distinct 姓名,dbo.uf_getstrs(姓名,'预定') as '预定',dbo.uf_getstrs(姓名,'数量') as '数量'
    into #临时表
    from 定单
    where 姓名='张三'