select 员工id,工资项1=sum(case when 工资项id=工资数  then 工资数 end),
工资项2=sum(case when 工资项id=津贴   then 工资数 end),
工资项3=sum(case when 工资项id=其他 then 工资数 end)
from 表 group by 员工id

解决方案 »

  1.   


    CREATE TABLE SalaryITem 
       (
        sitemID int,
        sitemname varchar(20)
       )CREATE TABLE SalaryData
       (
        empid int,
        sitemID int,
        salaryData int
       )insert into SalaryITem values(1,'基本工资')
    insert into SalaryITem values(2,'奖金')
    insert into SalaryITem values(3,'补贴')insert into SalaryData values(100,1,40)
    insert into SalaryData values(100,2,90)
    insert into SalaryData values(100,3,30)
    insert into SalaryData values(200,1,120)
    insert into SalaryData values(200,3,180)select * from SalaryITem
    select * from SalaryDatadeclare @s varchar(8000)
    set @s = ''
    select @s = @s + ',' + sitemname + '=max(case sitemid when ' + cast(sitemid as varchar) + ' then salarydata else '''' end)'
    from (select sitemid,sitemname from SalaryITem) a select @s
    exec('select empid'+@s+' from SalaryData  group by empid')
      

  2.   

    --测试表
    create table Employee(empid int ,empname varchar(10))
    create table SalaryITem(sitemID int ,sitemname varchar(10))
    create table SalaryData(sdataID int,empid int,sitemID int,salaryData money)
    --插入数据
    insert employee
    select 1,'aa'
    union select 2,'bb'
    insert SalaryITem
    select 1,'基本工资'
    union select 2,'等级工资'
    union select 3,'津贴'
    insert SalaryData
    select 1,1,1,1000
    union all select 2,1,2,200
    union all select 3,1,3,100
    union all select 4,2,1,2000
    union all select 5,2,2,100
    union all select 6,2,3,400
    --交叉表查询
    declare @s varchar(4000)
    set @s=''
    select @s=@s+',['+sitemname+']=max(case sitemID 
                   when '+cast(sitemID as varchar(10))+' then salaryData else 0 end)'
    from  SalaryITem
    exec('select 员工ID=empid'+@s+' from SalaryData group by empid')
    --结果
    /*
    员工ID        基本工资                  等级工资                  津贴                    
    ----------- --------------------- --------------------- --------------------- 
    1           1000.0000             200.0000              100.0000
    2           2000.0000             100.0000              400.0000
    */
      

  3.   

    select 员工id,工资项1=sum(case when 工资项id=工资数  then 工资数 end),
    工资项2=sum(case when 工资项id=津贴   then 工资数 end),
    工资项3=sum(case when 工资项id=其他 then 工资数 end)
    from 表 group by 员工id
      

  4.   

    这几天天天帮人解决这种问题(呵呵~~~),实现方法很多,我只说其中的主要思想
    工资项表的中数据一条一条取出来,然后拼成select语句的字段针对工资表的(即实验由行来列的转换),然后再分组求个小和:),就出来了。
    主要要用到动态SQL的方法
    仅供参考
      

  5.   

    如果工资项目固定的话(一般是不可能的)可以用一条sql语句实现楼主的要求。做的好点的话,还是写个存储过程比较好。在存储过程里要用到sp_executesql这个系统过程。
      

  6.   

    感谢Qihua_wu(小吴),不过工资项不固定的话,这样写sql是没有意义的,以后有修改还得改sql语句.
      

  7.   

    不要改的,我提到的sp_executesql是可以完全解决的(呵呵,只是实践总结出来的),你可以查查相关的帮助
      

  8.   

    如果不是很理解的话,可以联系俺[email protected](公司上网时间12:00-14:00(好像还要少点),19:00-8:00(非工作时间无人收邮件),其余时间禁网)
      

  9.   

    declare @s nvarchar(4000)
    set @s='select c.empid'
    set select @s=@s+','+'sum(case a.sitemname when'''+a.sitemname+''' then b.salaryData  end)['+a.sitemname+']'
                from SalaryITem as a 
    set @s=@s+' from SalaryITem as a 
                            inner join salaryData as b on a.sitemID=b.sitemID 
                            inner join Employee as c  on b.empid=c.empid
                            group by c.empid'exec (@s)--測試結果
    empid       基本工資                  等級工資                  津貼                    
    ----------- --------------------- --------------------- --------------------- 
    1           1000.0000             200.0000              100.0000
    2           2000.0000             100.0000              NULL