求救:传统问题的解决,高手们快来得分吧。
目前有三张表:
表一:学生基本信息表
学号 姓名 性别 系别
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)