SELECT 学生编号, SUM(CASE WHEN 项目编号='1' THEN 标准金额 END) 代管费,
SUM(CASE WHEN 项目编号='2' THEN 标准金额 END) 住宿费,
SUM(CASE WHEN 项目编号='3' THEN 标准金额 END) 上机费,
SUM(CASE WHEN 项目编号='4' THEN 标准金额 END) 学费,
SUM(标准金额) 标准金额..
FROM TABLE 
GROUP BY 学生编号

解决方案 »

  1.   

    monkey兄:
    项目的个数和名称都是变化了.
    所以你的方法有不便的地方.
    还有其它的方法吗?
      

  2.   

    create table tt
    (学生编号 char(8),项目编号 char(1),标准金额 numeric(5,2),实际金额 numeric(5,2),已收金额 numeric(5,2),托欠金额 numeric(5,2))
    insert into tt values('10401001','1',200.00,200.00,200.00,0.00)
    insert into tt values('10401001','2',200.00,200.00,200.00,0.00)
    insert into tt values('10401001','3',200.00,200.00,200.00,0.00)
    insert into tt values('10401001','4',200.00,200.00,200.00,0.00)
    insert into tt values('10401002','1',200.00,200.00,200.00,0.00)
    insert into tt values('10401002','3',200.00,200.00,200.00,0.00)
    insert into tt values('10401002','4',200.00,200.00,200.00,0.00)
    go
    create table tt2
    (项目编号 char(1), 项目名称 varchar(100))
    insert into tt2 values('1','代管费')
    insert into tt2 values('2','住宿费')
    insert into tt2 values('3','上机费')
    insert into tt2 values('4','学费')
    go
    create view v1 
    as
    select a.学生编号 ,b.项目名称,a.标准金额 ,a.实际金额 ,a.已收金额,a.托欠金额 
    from tt a,tt2 b where a.项目编号=b.项目编号
    go
    declare @sql varchar(8000)
    set @sql = 'select 学生编号'
    select @sql = @sql + ' ,sum(case 项目名称 when '''+项目名称+''' then 标准金额 end) ['+项目名称+']'
     from (select distinct 项目名称 from v1) as a
    select @sql = @sql+' ,合计标准金额=sum(标准金额),合计实际金额=sum(实际金额),合计已收金额=sum(已收金额),
    合计托欠金额=sum(托欠金额) from v1 group by 学生编号'
    exec(@sql)
    go
    drop table tt,tt2
    go
    drop view v1运行结果如下:学生编号 代管费 住宿费 上机费 学费 合计标准金额 合计实际金额 合计已收金额 合计托欠金额10401001 200.00 200.00 200.00 200.00 800.00 800.00 800.00 .00
    10401002 200.00 200.00 200.00 NULL 600.00 600.00 600.00 .00
      

  3.   

    发问前先看看FAQ,现成的答案就找到了