查询class表,得到下面的记录信息
select a,b,c from class       a           b              c
    收帐        公司1       财务核算部门    
    收帐        公司1       往来单位       
    收帐        公司2       财务核算部门    
    收帐        公司2       往来单位      
    付账        公司1       财务核算部门    
    付账        公司1       往来单位      
    付账        公司2       财务核算部门    
    付账        公司2       往来单位      我如何写语句得到下面的显示结果?
收帐        公司1       财务核算部门,往来单位 
收帐        公司2       财务核算部门,往来单位   
付账        公司1       财务核算部门,往来单位 
付账        公司2       财务核算部门,往来单位        

解决方案 »

  1.   

    go
    create table class
    (
    a varchar(20),
    b varchar(20),
    c varchar(20)
    )
    goinsert into class 
    select '收帐','公司1','财务核算部门'
    union
    select '收帐','公司1','往来单位'
    union
    select '收帐','公司2','财务核算部门'
    union
    select '收帐','公司2','往来单位'
    union
    select '付账','公司1','财务核算部门'
    union
    select '付账','公司1','往来单位'
    union
    select '付账','公司2','财务核算部门'
    union
    select '付账','公司2','往来单位'gocreate  FUNCTION fun
    (
    @a varchar(100),@b varchar(100)
    )
    RETURNS varchar(6000)
    AS
    BEGIN
        DECLARE @ResultVar varchar(6000)
        set @ResultVar=''
         
        
        select @ResultVar=@ResultVar+','+c from class
    where a=@a and b=@b
        return substring(@ResultVar,2,6000)
    END
    GO
    select a,b,dbo.fun(a,b) from class group by a,bgo
    drop function fun
    drop table classgohttp://www.mybuffet.cn
      

  2.   

    我用代码控制的,如下,但是得到的数据不对,请问我该怎么控制? Itemkbm.First;
     vpreCode := Qs(Itemkbm.FieldByName('FSubjectCode').AsString);
     vPrecompany := Itemkbm.FieldByName('FCompanyID').AsInteger;
     
    while not Itemkbm.Eof do
    begin
        SubjectCode := Qs(Itemkbm.FieldByName('a').AsString);
        companyid := Itemkbm.FieldByName('b').AsInteger;
        caption := Itemkbm.FieldByName('c').AsString;
        if SubjectCode = vpreCode then
        begin
          if companyid= vPrecompany then
          begin
            StringAdd(captionvalues,caption,',');
            values:=IntToStr(companyid)+'='+captionvalues;
            strs.Append(values);
          end else
          begin
            captionvalues:='';
            StringAdd(captionvalues,caption,',');
            values:=IntToStr(companyid)+'='+captionvalues;
            strs.Append(values);
          end;
        end else
        begin
          for i := 0 to strs.Count-1 do
          begin
            ShowMessage(strs.Strings[i]);
          end;
        end;
        vpreCode := Qs(Itemkbm.FieldByName('a').AsString);
        vPrecompany := Itemkbm.FieldByName('b').AsInteger;
        Itemkbm.Next;
    end;执行ShowMessage(strs.Strings[i])显示如下:(注:这不是我想要的结果)
    收帐        公司1      财务核算部门 
    收帐        公司1      财务核算部门,往来单位 
    收帐        公司2      财务核算部门
    收帐        公司2      财务核算部门,往来单位  
    付账        公司1      财务核算部门
    付账        公司1      财务核算部门,往来单位 
    付账        公司2      财务核算部门  
    付账        公司2      财务核算部门,往来单位 下面是我想要得到的结果
    收帐        公司1      财务核算部门,往来单位 
    收帐        公司2      财务核算部门,往来单位  
    付账        公司1      财务核算部门,往来单位 
    付账        公司2      财务核算部门,往来单位  
      

  3.   

    首先要预处理一下数据,还有你的表结构不够好
    Create table #T1
    (
    a nvarchar(10),
    b nvarchar(10),
    c nvarchar(20)
    )
    insert into #T1 values('收帐','公司1','财务核算部门')
    insert into #T1 values('收帐','公司1','往来单位')
    insert into #T1 values('收帐','公司2','财务核算部门')
    insert into #T1 values('收帐','公司2','往来单位')
    insert into #T1 values('付账','公司1','财务核算部门')
    insert into #T1 values('付账','公司1','往来单位')
    insert into #T1 values('付账','公司2','财务核算部门')
    insert into #T1 values('付账','公司2','往来单位')  
    Create table #T2
    (
    a nvarchar(10),
    b nvarchar(10),
    c nvarchar(20)
    )Create table #T3
    (
    a nvarchar(10),
    b nvarchar(10),
    c nvarchar(20)
    )insert into #T2
    select * from #T1 where c='财务核算部门' insert into #T3
    select * from #T1 where c='往来单位'
      
    select E.a, E.b, E.c + ',' + F.C 
    from #T2 as E
    inner join #T3 as F on E.B = F.B
    where E.a = F.adrop table  #T1
    drop table  #T2
    结果: 
      

  4.   

    vpreCode := Qs(Itemkbm.FieldByName('FSubjectCode').AsString); 
    vPrecompany := Itemkbm.FieldByName('FCompanyID').AsInteger; 
    是什么?你的字段不是a,b,c么?
      

  5.   

          if companyid= vPrecompany then 
          begin 
            StringAdd(captionvalues,caption,','); 
            values:=IntToStr(companyid)+'='+captionvalues; 
            strs.Append(values); 
          end else 
          begin 
            captionvalues:=''; 
            StringAdd(captionvalues,caption,','); 
            values:=IntToStr(companyid)+'='+captionvalues; 
            strs.Append(values); 
          end;
    你这段代码是不是一个是加“收帐        公司1      财务核算部门 ”,否则加“收帐        公司1      财务核算部门,往来单位 ”?
    如果是这样那直接屏蔽掉不适合的不就行了?
      

  6.   

    经过调试,终于成功,代码如下:
    {循环记录集,将核算项目以逗号分开显示于表格}
    function TSevCompanySubjectQry.DisposeData(const aConn: TSqlConnection;
      const ATableName: string): Boolean;
    var
      caption,captionvalues,
      SubjectCode,
      vReason:string;
      vSql:string;
      companyid:Integer;
      vpreCode: string;
      vPrecompany: integer;  strs :TStrings;
      i,lenvalues :Integer;
      values,field,fieldvalues,
      vname:string;
    begin
      strs := TStringList.Create;  vpreCode := Qs(Itemkbm.FieldByName('FSubjectCode').AsString);
      vPrecompany := Itemkbm.FieldByName('FCompanyID').AsInteger;
      Itemkbm.First;
      while not Itemkbm.Eof do
      begin
        SubjectCode := Qs(Itemkbm.FieldByName('FSubjectCode').AsString);
        companyid := Itemkbm.FieldByName('FCompanyID').AsInteger;
        caption := Itemkbm.FieldByName('FCaption').AsString;
        if SubjectCode = vpreCode then
        begin
          if companyid= vPrecompany then
          begin
            StringAdd(captionvalues,caption,',');
            values:=IntToStr(companyid)+'='+captionvalues;
          end else
          begin
            strs.Append(values);
            captionvalues:='';
            StringAdd(captionvalues,caption,',');
            values:=IntToStr(companyid)+'='+captionvalues;
          end;
        end else
        begin
          strs.Append(values);
          for i := 0 to strs.Count-1 do
          begin
            field:='f%s_1=%s,f%s_2=%s';
            field:=Format(field,[strs.Names[i],Qs('√'),strs.Names[i],qs(strs.Values[strs.Names[i]])]);
            stringadd(fieldvalues,field,',');
          end;
          vSql:='update %s set '+fieldvalues+' where FSubjectCode=%s';
          vSql:=Format(vSql,[ATableName,vpreCode]);
          try
            if not ConnExecute(aConn, vSql, vReason) then Exit;
          except
            on e:Exception do
            ShowMessage(e.Message);
          end;
          captionvalues:='';
          values:='';
          strs.Clear;
          fieldvalues:='';      captionvalues:=caption;
          values:=IntToStr(companyid)+'='+captionvalues;
        end;    vpreCode := Qs(Itemkbm.FieldByName('FSubjectCode').AsString);
        vPrecompany := Itemkbm.FieldByName('FCompanyID').AsInteger;
        Itemkbm.Next;
        if Itemkbm.Eof then
        begin
          fieldvalues:='';
          strs.Append(values);
          for i := 0 to strs.Count-1 do
          begin
            field:='f%s_1=%s,f%s_2=%s';
            field:=Format(field,[strs.Names[i],Qs('√'),strs.Names[i],qs(strs.Values[strs.Names[i]])]);
            stringadd(fieldvalues,field,',');
          end;
          vSql:='update %s set '+fieldvalues+' where FSubjectCode=%s';
          vSql:=Format(vsql,[ATableName,SubjectCode]);
          try
            if not ConnExecute(aConn, vSql, vReason) then Exit;
          except
            on e:Exception do
              ShowMessage(e.Message);
          end;    end;
      end;
      Result :=True;
    end;
      

  7.   


    if object_id('tb') is not null
       drop table tb
    go
    create table tb(a varchar(10),b varchar(10),c varchar(20))
    go
    insert into tb
    select '收帐','公司1','财务核算部门' union all
    select '收帐','公司1','往来单位' union all
    select '收帐','公司2','财务核算部门' union all
    select '收帐','公司2','往来单位' union all
    select '付账','公司1','财务核算部门' union all
    select '付账','公司1','往来单位' union all
    select '付账','公司2','财务核算部门' union all
    select '付账','公司2','往来单位'
    goif object_id('uf_union') is not null
       drop function uf_union
    go
    create function uf_union(@a varchar(10),@b varchar(10))
    returns varchar(100)
    as
    begin
      declare @str varchar(100)
      select @str=isnull(@str+',','')+c from tb where a=@a and b=@b
      return @str
    end
    go
    select a,b,dbo.uf_union(a,b) from tb group by a,b