有偿求助报表问题!

clf830616 2006-05-03 05:57:45
老问题了 小弟初学被卡住好久 很郁闷 程序是基于WEB的
我数据库中的成绩表格式如下 数据项不只这些
--------------------------------------------------------
姓名 学号 科目名称 科目分数 班级名称

张三 2003001 网页设计 95 2002级计算机一班
张三 2003001 数据结构 76 2002级计算机一班
李四 2003002 数据结构 65 2002级计算机二班
李四 2003002 网页设计 65 2002级计算机二班
王五 2003003 英语 70 2002级计算机一班
李四 2003002 英语 75 2002级计算机二班
张三 2003001 英语 46 2002级计算机一班
王五 2003003 网页设计 78 2002级计算机一班
---------------------------------------------------------

想在datagrid中实现这种格式功能
--------------------------------------------------------
姓名 学号 科目名称 科目分数 科目名称 科目分数 科目名称 科目分数 班级名称 总分 排名

张三 2003001 网页设计 95 数据结构 76 英语 46 2002级计算机一班 217 1
李四 2003002 网页设计 65 数据结构 65 英语 75 2002级计算机二班 205 2
王五 2003003 网页设计 78 NULL MULL 英语 70 2002级计算机一班 148 3

-----------------------------------------------------------
因以前的程序 成绩表的数据结构不想改变
大家帮我看看能否完成这种报表 能帮俺全部实现的可提供一定报酬~~

联系Q172292235
...全文
148 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
SeeSunSet 2006-05-06
  • 打赏
  • 举报
回复
select distinct a.姓名,a.学号,
科目名称1=(select top 1 b.科目名称 from table b where a.学号=b.学号 and b.科目名称='网页设计'),
成绩1=(select top 1 c.成绩 from table c where a.学号=c.学号 and c.科目名称='网页设计'),
//此处类推,可以从学科设置表中用循环生成各个科目名称的对应SQL
from table a
cansum396 2006-05-04
  • 打赏
  • 举报
回复
--------------------------------------------------------
姓名 学号 科目名称 科目分数 班级名称

张三 2003001 网页设计 95 2002级计算机一班
张三 2003001 数据结构 76 2002级计算机一班
李四 2003002 数据结构 65 2002级计算机二班
李四 2003002 网页设计 65 2002级计算机二班
王五 2003003 英语 70 2002级计算机一班
李四 2003002 英语 75 2002级计算机二班
张三 2003001 英语 46 2002级计算机一班
王五 2003003 网页设计 78 2002级计算机一班
---------------------------------------------------------
你不是有一个这样的表吗?
我给你的那段代码就可以通过你的表生成
不需要另外保存成新表
在vb.net中执行那段SQL代码
拿返回的datatable做datagrid的数据源就可以了
如果你的科目名称为不定数目的
那么就要记得datagrid要自动生成列
cansum396 2006-05-04
  • 打赏
  • 举报
回复
SELECT IDENTITY(INT,1,1) AS 排名,* into ##m FROM ##T ORDER BY 总分 desc
cansum396 2006-05-04
  • 打赏
  • 举报
回复
set nocount on
create table #tmp( 姓名 nvarchar(50),学号 nvarchar(50),科目名称 nvarchar(50),科目分数 INT,班级名称 nvarchar(50))
insert into #tmp
select
'张三', '2003001', '网页设计', '95', '2002级计算机一班'

union all
select
'张三', '2003001','数据结构', '76' ,'2002级计算机一班'
union all
select
'李四', '2003002', '数据结构', '65', '2002级计算机二班'
union all
select
'李四', '2003002', '网页设计', '65', '2002级计算机二班'
union all
select
'王五', '2003003', '英语', '70', '2002级计算机一班'
union all
select
'李四', '2003002', '英语', '75', '2002级计算机二班'
union all
select
'张三', '2003001', '英语', '46', '2002级计算机一班'
union all
select
'王五', '2003003', '网页设计', '78', '2002级计算机一班'
union all
select
'王五', '2003003', '高等数学', '78', '2002级计算机一班'

DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 姓名,学号,班级名称'
SELECT @SQL= @SQL+
',MIN(CASE WHEN 科目名称 = ''' + 科目名称 + ''' THEN 科目分数 END) [' + 科目名称 + ']'
FROM (SELECT DISTINCT 科目名称 FROM #tmp) A
print @sql
SET @SQL=@SQL+',sum(科目分数) as 总分 INTO ##T FROM #tmp GROUP BY 姓名,学号,班级名称 order by 总分 desc'
exec (@SQL)

SELECT IDENTITY(INT,1,1) AS PKID,* into ##m FROM ##T ORDER BY 总分 desc

select * from ##m

drop table #tmp
DROP TABLE ##T

排名 姓名 学号 班级名称 高等数学 数据结构 网页设计 英语 总分
----------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------- ----------- ----------- ----------- -----------
1 王五 2003003 2002级计算机一班 78 NULL 78 70 226
2 张三 2003001 2002级计算机一班 NULL 76 95 46 217
3 李四 2003002 2002级计算机二班 NULL 65 65 75 205

clf830616 2006-05-04
  • 打赏
  • 举报
回复
真心感谢 cansum396(沉觉不醒) !

之后如何把实现的这种格式保存为另一张成绩1表 数据可以随着原来的成绩表而更新呢

在VB。NET中如何触发这种更新呢


clf830616 2006-05-04
  • 打赏
  • 举报
回复
排名列可以随分页改变 比如第二页开始排名就是11
clf830616 2006-05-04
  • 打赏
  • 举报
回复
可以生成了! 但是在.net运行后还缺少一个想要的排名列哈 这个该怎样解决呢?
感谢的话不多说了
cansum396 2006-05-03
  • 打赏
  • 举报
回复
set nocount on
create table #tmp( 姓名 nvarchar(50),学号 nvarchar(50),科目名称 nvarchar(50),科目分数 INT,班级名称 nvarchar(50))
insert into #tmp
select
'张三', '2003001', '网页设计', '95', '2002级计算机一班'

union all
select
'张三', '2003001','数据结构', '76' ,'2002级计算机一班'
union all
select
'李四', '2003002', '数据结构', '65', '2002级计算机二班'
union all
select
'李四', '2003002', '网页设计', '65', '2002级计算机二班'
union all
select
'王五', '2003003', '英语', '70', '2002级计算机一班'
union all
select
'李四', '2003002', '英语', '75', '2002级计算机二班'
union all
select
'张三', '2003001', '英语', '46', '2002级计算机一班'
union all
select
'王五', '2003003', '网页设计', '78', '2002级计算机一班'
union all
select
'王五', '2003003', '高等数学', '78', '2002级计算机一班'

DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 姓名,学号,班级名称'
SELECT @SQL= @SQL+
',MIN(CASE WHEN 科目名称 = ''' + 科目名称 + ''' THEN 科目分数 END) [' + 科目名称 + ']'
FROM (SELECT DISTINCT 科目名称 FROM #tmp) A
SET @SQL=@SQL+',sum(科目分数) as 总分 FROM #tmp GROUP BY 姓名,学号,班级名称 order by 总分 desc'
exec (@SQL)

drop table #tmp

姓名 学号 班级名称 高等数学 数据结构 网页设计 英语 总分
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------- ----------- ----------- ----------- -----------
王五 2003003 2002级计算机一班 78 NULL 78 70 226
张三 2003001 2002级计算机一班 NULL 76 95 46 217
李四 2003002 2002级计算机二班 NULL 65 65 75 205

警告: 聚合或其它 SET 操作消除了空值。
cansum396 2006-05-03
  • 打赏
  • 举报
回复
觉得最后的显示方式有问题
姓名 学号 网页设计 班级名称 总分 排名
张三 2003001 95 2002级计算机一班 217 1
李四 2003002 65 2002级计算机二班 205 2
王五 2003003 78 2002级计算机一班 148 3
这样会不会好一些?
把科目名称做为head
clf830616 2006-05-03
  • 打赏
  • 举报
回复
语句不太会~~~
cansum396 2006-05-03
  • 打赏
  • 举报
回复
在sql中做竖转横

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧