表一:
学生编号 项目编号 标准金额 实际金额 已收金额 托欠金额
10401001 1 ¥200.00 ¥200.00 ¥200.00 ¥0.00
10401001 2 ¥200.00 ¥200.00 ¥200.00 ¥0.00
10401001 3 ¥200.00 ¥200.00 ¥200.00 ¥0.00
10401001 4 ¥200.00 ¥200.00 ¥200.00 ¥0.00
10401002 1 ¥200.00 ¥200.00 ¥200.00 ¥0.00
10401002 3 ¥200.00 ¥200.00 ¥200.00 ¥0.00
10401002 4 ¥200.00 ¥200.00 ¥200.00 ¥0.00
表二:
项目编号 项目名称
1 代管费
2 住宿费
3 上机费
4 学费
要得到的查询结果:
学生编号 代管费 住宿费 上机费 学费 合计标准金额 合计实际金额 合计已收金额 合计托欠金额
10401001 200 200 200 200 800 800 800 0
10401002 200 0 200 200 600 600 600 0
向各位高手请教:应如何才能得到以上结果???

解决方案 »

  1.   

    用select 学生编号,sum(...) into temptable1 from ... group by 学生编号 将汇总的数据保存到临时表中,然后
    select 学生编号,(select 已收金额 from 表1 where bh='1' ) as 代管费,(select 已收金额 from 表1 where bh='2' ) as 住宿费,(select 已收金额 from 表1 where bh='3' ) as 上机费,(select 已收金额 from 表1 where bh='4' ) as 学费 into temptable2 from 表1 group by 学生编号最后将两个表的列根据"学生编号"列连起来显示出来就可以了,如果表2时动态的,那么就动态组织第二个sql语句就是了
      

  2.   

    selete 学生编号,
      sum(case 项目编号 =1 then 标准金额 else 0) as  代管费,
      sum(...)
    from 表一
    group by 学生编号见SQL SERVER help file
      

  3.   

    create table table1
    (学生编号 varchar(50),
     项目编号 int,
     标准金额 money,
     实际金额 money,
     已收金额 money,
     拖欠金额 money)gocreate table table2
    (项目编号 int,
     项目名称 varchar(50))goinsert into table1
    select '10401001',1, 200.00, 200.00, 200.00, 0.00
    union select '10401001',2, 200.00, 200.00, 200.00, 0.00
    union select '10401001',3, 200.00, 200.00, 200.00, 0.00
    union select '10401001',4, 200.00, 200.00, 200.00, 0.00
    union select '10401002',1, 200.00, 200.00, 200.00, 0.00
    union select '10401002',3, 200.00, 200.00, 200.00, 0.00
    union select '10401002',4, 200.00, 200.00, 200.00, 0.00
    goinsert into table2
    select 1, '代管费'
    union select 2, '住宿费'
    union select 3, '上机费'
    union select 4, '学费'
    goselect 学生编号, 
      sum(case when 项目编号 = 1 then 标准金额 else 0 end) as 代管费,
      sum(case when 项目编号 = 2 then 标准金额 else 0 end) as 住宿费,
      sum(case when 项目编号 = 3 then 标准金额 else 0 end) as 上机费,
      sum(case when 项目编号 = 4 then 标准金额 else 0 end) as 学费,
      sum(实际金额) as 合计实际金额,
      sum(已收金额) as 合计已收金额,
      sum(拖欠金额) as 合计拖欠金额
    from table1
    group by 学生编号查询结果:
    10401001 200.00 200.00 200.00 200.00 800.00 800.00 .00
    10401002 200.00 .00    200.00 200.00 600.00 600.00 .00不过这样感觉table2就没什么用了,当table2有变动时,需改sql语句,添加型如
      sum(case when 项目编号 = n then 标准金额 else 0 end) as XX费,
    的行
      

  4.   

    解决,把查询那段改为如下语句declare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + ' sum(case when 项目编号 = ' + convert(varchar(20), 项目编号) +
      ' then 标准金额 else 0 end) as ' + 项目名称 + ','
    from table2if (@sql <> '')
    begin
      set @sql = 'select 学生编号,' + @sql +
        'sum(实际金额) as 合计实际金额,
        sum(已收金额) as 合计已收金额,
        sum(拖欠金额) as 合计拖欠金额
        from table1
        group by 学生编号'
      exec(@sql)
    end
      

  5.   

    if (@sql <> '')这个判断可要可不要,你看怎么处理方便就怎么着,呵呵