有一个表tab,表中有以下内容
  代码            动作      数量    班组     工号     机器 
A57000101 1 进入 0 B 000053 A1
A57000101 1 进入 0 C 0004 A2
A57000101 1 进入 102033 A NULL NULL 想得到的数据是:
代码            动作      数量      班组     工号              机器 
A57000101 1      进入    102033 B,C 000053,0004     A1,A2应该用什么样的查询语句才可以实现呢?
请各位大侠指教!谢谢!

解决方案 »

  1.   

    好奇怪,排好版的怎么发出来就乱了...
    再发一次:
      代码                      动作      数量    班组     工号        机器 
    A57000101            进入   0   B 000053    A1
    A57000101   进入   0   C 0004         A2
    A57000101            进入 102033   A NULL      NULL 想得到的数据是:
    代码            动作          数量         班组          工号              机器 
    A57000101      进入          102033      B,C   000053,0004        A1,A2
      

  2.   

    declare @a nvarchar(20),
    @b nvarchar(20),
    @c nvarchar(20),
    @d nvarchar(20),
    @e nvarchar(20)declare @aa nvarchar(20),
    @bb nvarchar(20),
    @cc nvarchar(20),
    @dd nvarchar(20),
    @ee nvarchar(20)
    set @a = ''
    set @b = ''
    set @c = ''
    declare Fee cursor for 
    select distinct 代码 from tab where 条件
    declare @Fee_ID int   
    open Fee       
    fetch next from Fee into @Fee_ID
    while @@fetch_status = 0    
      begin select @a=动作,@b=数量,@c=班组,@d=工号,@e=机器 from tb_asp_feekind where fee_id = @Fee_ID
    if @a is not null
     set @aa = @AA+@a+','
    select @aa if @B is not null
     set @BB = @BB+@B+','
    select @BB fetch next from Fee into @Fee_ID
      end
    close Fee                                 
    deallocate Fee  
      

  3.   

    create function fn_数量(
    @代码  char(20),
    @动作 char(30)
    )
    returns int
    as
    begin
       declare @r int
       set @r=0
       select @r=sum(数量) from tab
       where 代码=@代码
          and 动作=@动作
       return @r
    end
    gocreate function fn_班组(
    @代码  char(20),
    @动作 char(30)
    )
    returns varchar(2000)
    as
    begin
       declare @r varchar(2000)
       set @r=''
       select @r=@r+班组 from tab
       where 代码=@代码
          and 动作=@动作
          and 班组 is not null
       return @r
    end
    gocreate function fn_工号(
    @代码  char(20),
    @动作 char(30)
    )
    returns varchar(2000)
    as
    begin
       declare @r varchar(2000)
       set @r=''
       select @r=@r+工号 from tab
       where 代码=@代码
          and 动作=@动作
          and 工号 is not null
       return @r
    end
    gocreate function fn_机器(
    @代码  char(20),
    @动作 char(30)
    )
    returns varchar(2000)
    as
    begin
       declare @r varchar(2000)
       set @r=''
       select @r=@r+机器 from tab
       where 代码=@代码
          and 动作=@动作
          and 机器 is not null
       return @r
    end
    go--查询 select 代码,动作,
     dbo.fn_数量(代码,动作) as 数量,
     dbo.fn_班组(代码,动作) as 班组,
     dbo.fn_工号(代码,动作) as 工号,
     dbo.fn_机器(代码,动作) as 机器
     from tab
     group by 代码,动作
    --注意效率确实很低
      

  4.   

    三个函数要改,少“,”create function fn_班组(
    @代码  char(20),
    @动作 char(30)
    )
    returns varchar(2000)
    as
    begin
       declare @r varchar(2000)
       set @r=''
       select @r=@r+班组+',' from tab
       where 代码=@代码
          and 动作=@动作
          and 班组 is not null
       if @r<>''
           set @r=left(@r,len(@r)-1)
       return @r
    end
    gocreate function fn_工号(
    @代码  char(20),
    @动作 char(30)
    )
    returns varchar(2000)
    as
    begin
       declare @r varchar(2000)
       set @r=''
       select @r=@r+工号+',' from tab
       where 代码=@代码
          and 动作=@动作
          and 工号 is not null
       if @r<>''
           set @r=left(@r,len(@r)-1)
       return @r
    end
    gocreate function fn_机器(
    @代码  char(20),
    @动作 char(30)
    )
    returns varchar(2000)
    as
    begin
       declare @r varchar(2000)
       set @r=''
       select @r=@r+机器+',' from tab
       where 代码=@代码
          and 动作=@动作
          and 机器 is not null
       if @r<>''
           set @r=left(@r,len(@r)-1)
       return @r
    end
    go
      

  5.   

    函数出来的结果是这样:
    B6305770R 1 101063 B,A,C, 000061,
    B6305770R 2 100911 B,C,A, 000145,000467, B20 ,B20 ,B20 ,
    B6305770R 3 100700 B,C,A, 000100,000183, B7  ,B7  ,B7  ,
    B6305770R 4 100022 A,B,C, 000285,          B2  ,B2  ,B2  ,
    B6305770R 5 0 C,B,A,
    B6305770R 6 100000 C,A,B, 000315,
    B6305770R 7 0 A,B,C,
    这其中机器名重复了,我在前面加了个distinct以消除...
    btlyeo(春天) 的游标还在测试中...
      

  6.   

    那再改函数,效率又要下降了
    create function fn_机器(
    @代码  char(20),
    @动作 char(30)
    )
    returns varchar(2000)
    as
    begin
       declare @r varchar(2000)
       set @r=''
       select @r=@r+机器+',' from (
       select  distinct 机器 from tab
       where 代码=@代码
          and 动作=@动作
          and 机器 is not null
       )
       if @r<>''
           set @r=left(@r,len(@r)-1)
       return @r
    end
    go
    --最后的“,”怎么没去掉?
      

  7.   

    最原始的数据是这样的:
    代码      动作            数量     班组     工号      机器
    B6305770R  1 0 B NULL NULL
    B6305770R  1 101063 A 000061 NULL
    B6305770R  1 0 C NULL NULL
    B6305770R  2 0 B 000145 B20 
    B6305770R  2 0 C NULL B20 
    B6305770R  2 100911 A 000467 B20 
    B6305770R  3 0 C NULL B7  
    B6305770R  3 10700 B 000100 B7  
    B6305770R  3 90000 A 000183 B7  
    B6305770R  4 0 C NULL B2  
    B6305770R  4 100022 A 000285 B2  
    B6305770R  4 0 B NULL B2  
    B6305770R  5 0 B NULL NULL
    B6305770R  5 0 C NULL NULL
    B6305770R  5 0 A NULL NULL
    B6305770R  6 0 B NULL NULL
    B6305770R  6 0 C NULL NULL
    B6305770R 6 100000 A 000315 NULL
    B6305770R 7 0 B NULL NULL
    B6305770R  7 0 A NULL NULL当我在查询时加条件工号是000145时,数量的结果有出入...
    加条件以机器查询结果是对的
      

  8.   

    数据量大游标确实不怎么合适,Yang_(扬帆破浪) 的方法比我的强,关注ing表里的代码字段的重复值多不多?如果很多的话试试再加上表变量或者临时表?