select (F1+F2+F3) as 基本工资, (F4+F5) as 补助工资 From A

解决方案 »

  1.   

    select 员工代号,H1=f1+f2+f3, H2=f4+f5 from tablename
    是不是这个意思,我想应该不是吧
      

  2.   

    回复人: athlongyj() ( ) 信誉:100  2005-12-16 16:24:00  得分: 0  
     
     
       select (F1+F2+F3) as 基本工资, (F4+F5) as 补助工资 From A
      
     
    -------------------
    不是这样的,因为表B的项目不是固定的,
    汇总的时候H1应该用
    (select 项目明细代号 from B where 汇总项目代号 = 'H1')查询结果横向加起来
    来代替
      

  3.   

    --生成测试数据
    create table A(ECode int,[F1] int,[F2] int,[F3] int,[F4] int,[F5] int)
    insert into A select 1000,1000,200,100,50,60
    insert into A select 1001,2000,300,300,50,20 
    create table B(PCode varchar(10),CCode varchar(10))
    insert into B select 'H1','F1'
    insert into B select 'H1','F2'
    insert into B select 'H1','F3'
    insert into B select 'H2','F4'
    insert into B select 'H2','F5'--执行动态查询过程
    declare @s varchar(8000),@v varchar(1000),@PCode varchar(10)
    set @s = 'select ECode'declare c cursor for select distinct PCode from B
    open c
    fetch next from c into @PCodewhile @@fetch_status=0
    begin
        set @s = @s+',['+@PCode+']='
        set @v = ''
        select @v=@v+'+'+CCode from B where PCode=@PCode
        set @s = @s+'('+stuff(@v,1,1,'')+')'
        fetch next from c into @PCode
    end
    close c
    deallocate cset @s = @s + ' from A'
    exec(@s)--输出结果
    /*
    ECode    H1       H2
    -------------------------------
    1000 1300 110
    1001 2600 70
    */--删除测试数据
    drop table A,B
      

  4.   

    也就是说如何把
    select 项目明细代号 from B where 汇总项目代号 = 'H1'
    的查询结果
    换成 F1+F2+F3...
      

  5.   

    to libin_ftsafe(子陌红尘|潇湘剑公子@dev-club) 
    能不能不用游标呢,用游标听说有问题,效率好像很低
    因为我的数据量很大的
      

  6.   

    可以不用游标,那就得用Join,作一个右连接,这样可以选择出来所有的H1、H2和F1、F2等的对应表,然后使用循环取出所有的对应项,最好是生成一个字符串,和libin_ftsafe的方法是一样的。
      

  7.   

    不过感觉,使用Join,速度不如游标快。
      

  8.   

    项目明细表里的数据量很大?不应该吧。使用游标只是用于拼装动态SQL语句的字符串,而且仅操作项目明细表,不会过多的影响查询效率。
      

  9.   

    可以考虑在系统闲时,生成Temp表,这样的话,能够充分利用系统的资源。