日期:2014-05-18  浏览次数:20660 次

求救:传统问题的解决,高手们快来得分吧。
目前有三张表:

表一:学生基本信息表
      学号   姓名   性别     系别
      0001   张三     男       计算机
      0002   李四     男       经管系
      0003   王五     女       外语系      

表二:收费项目定义表:
      费用代码         费用名称
      XF                     学费
      SF                     书费
      ZSF                   住宿费

表三:学生费用表:
      学号     费用代码       金额
      0001         XF               5000
      0001         SF               500
      0001         ZSF             800
      0002         XF               3500
      0002         SF               500
      0002         ZSF             500    
      0003         XF               3500
      0003         SF               500
      0003         ZSF             1000    

想得到的结果是:
      学号     姓名     性别   系别       学费     书费     住宿费   合计
      001       张三       男     计算机   5000     500       800         6300
      002       李四       男     经管系   3500     500       500         4500
      003       王五       女     外语系   3500     500       1000       5000  


难点:
    主要是在目的表上的列中,费用是动态变化的,需要和收费项目定义表中的个数匹配,取全部的记录作为列名。合计字段求和。对这样的查询,可能非常频繁,客户端较多,还希望能够考虑到性能问题。这个问题可能是一个典型的行转列问题。请高手帮忙解决,对解决的人将高分奖励。
   


------解决方案--------------------
你用的是sql2000还是sql2005?sql2000效率不高,sql2005比较好
------解决方案--------------------
declare @sql varchar(4000)
set @sql= 'select a.学号 , a.姓名 ,a.性别 ,a.系别 '
select @sql=@sql+ ',[ '+费用名称+ ']=sum(case c.费用代码 when ' ' '
+费用代码+ ' ' ' then c.金额 else 0 end) '
from 表二
set @sql=@sql+ ',[合计]=sum(c.金额) from 表一 a , 表二 b, 表三 c where a.学号=b.学号 and b.费用代码=c.费用代码 '
set @sql=@sql+ ' group by a.学号 , a.姓名 ,a.性别 ,a.系别 '
exec(@sql)