新人求助!这个排名分布表怎么实现?

searoc_1117 2015-10-29 01:12:31
大家好,我要做这一个这种表,各科的排名分布情况

打算在前端用两个条件做查询

数据库方面,我只有一个表,非常大,所有的信息都在,如下:


本人纯新手,会的东西不多,听说gridview开发快速,功能也还行,就想用gridview实现排名分布表。
但是发现很多问题:
1、表头是班级名,每个年级,考次的班级还不一样,所以这个表头要动态,还要自定义,我完全不会了。
2、第二行还有个最高分,(总之这个表不规则),不会弄
3、第三行以下的各班各科前X名都要一个一个的查出来吧,不会弄

我也自学了两天gridview,无奈基础太差,好多东西搞不明白。以至现在产生怀疑:
4、这个表用gridview到底能不能做出来?
5、这种不很规则的表,用gridview方便还是别更好些?或者这种表根本不用服务器控件?

问的东西比较多,还望大神不吝赐教!
...全文
306 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
searoc_1117 2015-11-07
  • 打赏
  • 举报
回复
引用 7 楼 ajianchina的回复:
也不说空话了,你的意思明白了,我就大概讲讲我的思路: 你的两个条件直接可以先将其范围框出来,条件差不多这样:where 班级 like '八(%' and 考试时间 between '2014-9-1' and '2015-09-1' group by 班级 上面这样就行了。 取到这样的数据,然后定义一个datatable变量,先新增第一个列,对上面取到的数据进行一下组循环,循环过程就是为了给datatable新增班级列,这个有了,你的动态列标题就有了,如果直接绑定gridview列标题就是datatable标题。 然后gridview中的行数据按你的图片基本上是固定的,按这样的固定条件再循环一次,给datatable填充数据,当然填充的时候会按照datatable的列往里面填充。这个工作完成就可以直接绑定gridview。
大神,来看看我写的东西。觉得写的可笨,求指点。
liumingqiu32 2015-11-06
  • 打赏
  • 举报
回复
group by
a3212b12 2015-11-05
  • 打赏
  • 举报
回复
楼主表格中的逻辑有问题: 例如:前10名(107分以上),这里的两个条件是制约的,有时候前10名的分可能不到 107分,或者有时候107分以上的人可能是大于10的好多人。 所以,你这个还要区分,要么按名次统计分数线,要么按分数线统计人数。
searoc_1117 2015-11-05
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e) { int[] cblarray; cblarray = (int[])Session["cblarray"]; string kaoci = Request.QueryString["kaoci"]; string nianji = Request.QueryString["nianji"]; string kemu = Request.QueryString["kemu"]; //string mingci = Request.QueryString["mingci"]; string mingci=" "; for (int i = 0; i < cblarray.Length; i++) { mingci += Convert.ToString(cblarray[i]) + " ,"; } Response.Write("这里查询的是:"); Response.Write(kaoci); Response.Write(" | "); Response.Write(nianji); Response.Write(" | "); Response.Write(kemu); Response.Write(" | "); Response.Write("年级前"+mingci+"名"); Response.Write("的排名分布"); Response.Write("<br>"); //下面开始连接数据库 //获取连接自符串,很重要 string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["cjcxConnectionString"].ConnectionString; SqlConnection myconn = new SqlConnection(ConnectionString);//做连接 myconn.Open(); DataTable Dt_fenbu = new DataTable("fenbu");//这里写个字符串什么意思? DataTable tempDt = new DataTable(); //查出年级人数 int renshu; string sqlStr = "SELECT count(姓名) FROM [exam_kmmc] WHERE (([考试名称] ='" + kaoci + "') AND ([年级] ='" + nianji + "'))"; SqlCommand myCmd = new SqlCommand(sqlStr, myconn); SqlDataAdapter myDa = new SqlDataAdapter(myCmd); tempDt = new DataTable(); myDa.Fill(tempDt); renshu = Convert.ToInt32(tempDt.Rows[0][0]); Response.Write("此年级有" + renshu + "人"); //做表头---------------------------------------------------------- //DataSet myDs = new DataSet(); DataTable Dt_bjm = new DataTable(); sqlStr = "SELECT [班级] FROM [exam_kmmc] WHERE (([考试名称] ='" + kaoci + "') AND ([年级] ='" + nianji + "')) group by [班级] order by [班级]"; myCmd = new SqlCommand(sqlStr, myconn); myDa = new SqlDataAdapter(myCmd); myDa.Fill(Dt_bjm); //下面开始填充表头 DataColumn workCol = Dt_fenbu.Columns.Add(nianji+" ["+kemu+"] 排名分布"); for (int i = 0; i < Dt_bjm.Rows.Count; i++) { Dt_fenbu.Columns.Add(Convert.ToString(Dt_bjm.Rows[i][0])); //Response.Write(Convert.ToString(Dt_bjm.Rows[i][0])); //Response.Write("["+Dt_fenbu.Columns[i].ColumnName+"]"); } Dt_fenbu.Columns.Add("合计"); //下面开始做最高分行 tempDt = new DataTable(); string sqlStr1 = "SELECT MAX("+kemu+") AS 最高分, 班级 FROM exam_kmmc WHERE (考试名称 = '"+kaoci+"') AND (年级 = '"+nianji+"') GROUP BY 班级 ORDER BY 班级"; myCmd = new SqlCommand(sqlStr1, myconn); myDa = new SqlDataAdapter(myCmd); myDa.Fill(tempDt); //下面开始填充最高分行 DataRow newrow; newrow = Dt_fenbu.NewRow(); newrow[0] = "班级最高分"; for (int i = 0; i < tempDt.Rows.Count; i++) { newrow[i + 1] = tempDt.Rows[i][0]; } Dt_fenbu.Rows.Add(newrow); //下面开始写排名分布行 string pdmc;//判断名次 string pdmc2;//判断名次2 if (kemu == "总分") { pdmc = ""; } else { pdmc="级名次"; } if (kemu == "总分") { pdmc2 = "级名次"; } else { pdmc2 = kemu+"级名次"; } //从这开始循环 for(int ii=0;ii<cblarray.Length;ii++) { //查出每班的名次分布 tempDt = new DataTable(); int tempsum = 0; mingci = Convert.ToString(cblarray[ii]); sqlStr = "SELECT count(" + kemu + pdmc +") AS 名次分布, min("+kemu+") as 最小值,班级 FROM exam_kmmc WHERE (考试名称 = '" + kaoci + "') AND (年级 = '" + nianji + "') AND ("+pdmc2+"<"+mingci+") GROUP BY 班级 ORDER BY 班级"; myCmd = new SqlCommand(sqlStr, myconn); myDa = new SqlDataAdapter(myCmd); myDa.Fill(tempDt); //Response.Write("<br>次此查询的科目是: " + kemu); //查出最低份 string minfen; string sqlStr3 = "SELECT min(" + kemu + ") as "+kemu+"最小值 FROM exam_kmmc WHERE (考试名称 = '" + kaoci + "') AND (年级 = '" + nianji + "') AND (级名次<" + mingci + ") "; SqlCommand myCmd3 = new SqlCommand(sqlStr3, myconn); SqlDataAdapter myDa3 = new SqlDataAdapter(myCmd3); DataTable tempDt3 = new DataTable(); myDa3.Fill(tempDt3); minfen=Convert.ToString(tempDt3.Rows[0][0]); //开始填充排名分布行 newrow = Dt_fenbu.NewRow(); int j; j = 0; newrow[0] = "年级前" + mingci + "名"+"("+ minfen +"分以上)"; for (int i = 0; i < Dt_fenbu.Columns.Count-2; i++) { //用if是为了判断查询为空的班级 //Response.Write("<hr>"); //Response.Write(Dt_fenbu.Columns[i + 1].ColumnName); //Response.Write(tempDt.Rows[j][2]); if (Dt_fenbu.Columns[i + 1].ColumnName == Convert.ToString(tempDt.Rows[j][2])) { //用行名班去比对查出来的班,不管有没有,列都加1,即i+1;如果对上了,查询表的行+1 //这样的写法,就要求查询表一定要按班级排序 //Response.Write("有-"); newrow[i + 1] = tempDt.Rows[j][0]; tempsum += Convert.ToInt32(tempDt.Rows[j][0]); if(j<tempDt.Rows.Count-1) j++; } else { //Response.Write("无-"); newrow[i + 1] = 0; } //newrow[i + 1] = tempDt2.Rows[i][0]; //tempsum += Convert.ToInt32(tempDt2.Rows[i][0]); } newrow[Dt_fenbu.Columns.Count-1] = tempsum; Dt_fenbu.Rows.Add(newrow); //写入上下箭头箭头 string jiantou="↑ ↓"; Double avg=(Double)tempsum/(Dt_fenbu.Columns.Count-2); Double avg_0; //Response.Write(tempsum); //Response.Write(avg); avg=Math.Round(avg,1,MidpointRounding.AwayFromZero); avg_0 = Math.Round(avg, 0, MidpointRounding.AwayFromZero); //Response.Write(avg); Dt_fenbu.Rows[Dt_fenbu.Rows.Count - 1][0] = Convert.ToString(Dt_fenbu.Rows[Dt_fenbu.Rows.Count - 1][0]) + "平均" + Convert.ToString(avg) + "人/班"; //Math.Round(45.367, 2, MidpointRounding.AwayFromZero); for (int i = 0; i < Dt_fenbu.Columns.Count-2; i++) { if (Convert.ToInt32(Dt_fenbu.Rows[Dt_fenbu.Rows.Count-1][i + 1]) == avg_0) { jiantou = ""; } else { if (Convert.ToInt32(Dt_fenbu.Rows[Dt_fenbu.Rows.Count - 1][i + 1]) > avg_0) { jiantou = " ↑"; } else { jiantou = " ↓"; } } Dt_fenbu.Rows[Dt_fenbu.Rows.Count - 1][i + 1] = Convert.ToString(Dt_fenbu.Rows[Dt_fenbu.Rows.Count - 1][i + 1]) + jiantou; } if (cblarray[ii] >= renshu) break; //到这结束 } GridView_fenbu.DataSource = Dt_fenbu; GridView_fenbu.DataBind(); myconn.Close(); }
searoc_1117 2015-11-05
  • 打赏
  • 举报
回复
谢谢大家的回复,本来问题不难,关键是我这个小白太白了。
白成啥样呢?在发帖子的时候,我连啥是ado.net都不知道。
前期做了两个查询,我几乎没写过代码,全控件。
下面我说说我的做法,总感觉可笨,查的时候很慢,希望大家再提点意见。

这是查询条件

这是查询结果


建一个“分布表”,将查到的东西往里装,完事后绑定gridview。但是做了好多个查询,不知能否简化。
第一步,做表头。第一次查询,根据 考次, 年级 两个参数,查出班级名称。用循环在 分布表 建列,把班级名写到列名里。
第二步,做最高分行。第二次查询,根据 考次, 年级, 科目 三个参数,用group by 班级,查出每个班的最高分。用循环把写到新建行。
第三步,做成绩分布。第三次查询,根据 考次,年级,科目,名次 四个参数,用group by 班级查出每个班某某名次以上学生个数。用循环写到新建行。第四次查询,根据 考次,年级,科目,名次 四个参数,查出某某分数段的最低分,写到新建行的第一格。
循环第三步。
还有第五次查询,查出某年级总人数,用来做分数段的判断用。
这其中还有一些小的处理,写上下箭头,处理某个分数段缺失的班级等等。
我感觉我写的好麻烦,用了很多循环,写的很乱。
可能好多东西用的不合理,希望大家提出意见。
一会上代码。
searoc_1117 2015-11-05
  • 打赏
  • 举报
回复
谢谢大家,我搞出来了。一会儿说我的做法。
lutaotony 2015-10-30
  • 打赏
  • 举报
回复
一种方式是直接数据绑定到gridview 这种可以参考72绝技gridview,应该可以,还有的就是直接数据查询出来,后把需要的数据写到datatable中,再绑定到gridview上。
a3212b12 2015-10-29
  • 打赏
  • 举报
回复
你这个简单的方法就是 一行一行的查询,甚至一个一个单元格的查出来,前台组合到一个table里,再显示到gird中。 查询可前台,也可后台。
searoc_1117 2015-10-29
  • 打赏
  • 举报
回复
引用 1 楼 u014751677 的回复:
你的列好多啊,为什么全都放在一个表里面,,分开比较好吧
我不懂呀,完全是自己摸索的。 其实这个表挺简单的,只有学号,姓名,考次,科目等一些信息,用一个表完全够用,用多个表反而麻烦。你看到的这些名次都是查询出来放在视图里的。
ajianchina 2015-10-29
  • 打赏
  • 举报
回复
也不说空话了,你的意思明白了,我就大概讲讲我的思路: 你的两个条件直接可以先将其范围框出来,条件差不多这样:where 班级 like '八(%' and 考试时间 between '2014-9-1' and '2015-09-1' group by 班级 上面这样就行了。 取到这样的数据,然后定义一个datatable变量,先新增第一个列,对上面取到的数据进行一下组循环,循环过程就是为了给datatable新增班级列,这个有了,你的动态列标题就有了,如果直接绑定gridview列标题就是datatable标题。 然后gridview中的行数据按你的图片基本上是固定的,按这样的固定条件再循环一次,给datatable填充数据,当然填充的时候会按照datatable的列往里面填充。这个工作完成就可以直接绑定gridview。
moonwrite 2015-10-29
  • 打赏
  • 举报
回复
不要想一条sql搞定,多条查询 然后把结果评价在一起 班级最高级 班级前10名 ......
beyon2008 2015-10-29
  • 打赏
  • 举报
回复
核心问题还是数据提取,先写一个存储过程得到结果集再说,前台的东西相对容易
ajianchina 2015-10-29
  • 打赏
  • 举报
回复
用gridview没问题的,你的问题不是用什么来显示,而是怎样解决查询及自定义表的列标题,我可以帮你的。
  • 打赏
  • 举报
回复
你这个不就是各种group by 加行列转化吗?
sdfgrtyu 2015-10-29
  • 打赏
  • 举报
回复
Repeater应该可以
纸飞机_ 2015-10-29
  • 打赏
  • 举报
回复
你的列好多啊,为什么全都放在一个表里面,,分开比较好吧

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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