基于VB.NET从SQL表统计男女奖学金人数并绘制图表的技术问询
完整解决方案:按年份统计男女奖学金人数并绘制图表
一、修正后的SQL查询语句
你原来的SQL问题在于没有按年份分组,直接用COUNT配合CASE会导致统计结果不符合预期。这里需要先提取DateGranted的年份作为分组依据,再用SUM结合CASE分别统计对应年份的男女人数:
SELECT YEAR(s.DateGranted) AS [Year], SUM(CASE WHEN s.Gender = 'M' THEN 1 ELSE 0 END) AS [MALE], SUM(CASE WHEN s.Gender = 'F' THEN 1 ELSE 0 END) AS [FEMALE] FROM ScholarshipGrants s WHERE s.DateGranted >= '2013-01-01' -- 推荐用标准日期格式避免解析歧义 GROUP BY YEAR(s.DateGranted) ORDER BY YEAR(s.DateGranted) ASC;
关键说明:
YEAR(s.DateGranted):从发放日期中提取年份,作为分组的核心字段SUM(CASE...):逐行判断性别,符合条件则计1,否则计0,最终求和得到对应年份的男女获奖人数GROUP BY YEAR(...):确保统计结果按年份独立分组,不会混在一起- 用
YYYY-MM-DD格式的日期条件,能避免不同数据库环境下的日期解析错误
二、VB.NET绘制图表实现(以WinForms为例)
假设你用WinForms的Chart控件展示数据,以下是完整的实现步骤:
1. 准备界面
在WinForms窗体中拖拽添加一个Chart控件(命名为chartScholarStats),这是展示图表的载体。
2. 数据绑定与绘图代码
Imports System.Data.SqlClient Imports System.Windows.Forms.DataVisualization.Charting Private Sub LoadScholarshipChart() ' 替换为你的实际数据库连接字符串 Dim connString As String = "Data Source=你的服务器名;Initial Catalog=你的数据库名;Integrated Security=True;" ' 使用修正后的SQL查询 Dim sqlQuery As String = "SELECT YEAR(s.DateGranted) AS [Year], SUM(CASE WHEN s.Gender = 'M' THEN 1 ELSE 0 END) AS [MALE], SUM(CASE WHEN s.Gender = 'F' THEN 1 ELSE 0 END) AS [FEMALE] FROM ScholarshipGrants s WHERE s.DateGranted >= '2013-01-01' GROUP BY YEAR(s.DateGranted) ORDER BY YEAR(s.DateGranted) ASC;" Using conn As New SqlConnection(connString) Using adapter As New SqlDataAdapter(sqlQuery, conn) Dim statsTable As New DataTable() adapter.Fill(statsTable) ' 清空图表原有数据 chartScholarStats.Series.Clear() ' 创建男性数据系列 Dim maleSeries As New Series("男性") maleSeries.ChartType = SeriesChartType.Column ' 可选Line、Bar等图表类型 maleSeries.XValueMember = "Year" maleSeries.YValueMembers = "MALE" ' 创建女性数据系列 Dim femaleSeries As New Series("女性") femaleSeries.ChartType = SeriesChartType.Column femaleSeries.XValueMember = "Year" femaleSeries.YValueMembers = "FEMALE" ' 将系列添加到图表 chartScholarStats.Series.Add(maleSeries) chartScholarStats.Series.Add(femaleSeries) ' 绑定数据源并渲染 chartScholarStats.DataSource = statsTable chartScholarStats.DataBind() ' 优化图表外观(可选) chartScholarStats.Titles.Add("各年份男女奖学金获得者统计") chartScholarStats.ChartAreas(0).AxisX.Title = "年份" chartScholarStats.ChartAreas(0).AxisY.Title = "人数" chartScholarStats.Legends.Add(New Legend("性别统计")) End Using End Using End Sub
3. 触发图表加载
在窗体的Load事件中调用上述方法,窗体启动时自动加载图表:
Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load LoadScholarshipChart() End Sub
三、适配注意事项
- 如果使用MySQL/Oracle等数据库,需调整年份提取函数:MySQL用
YEAR(),Oracle用EXTRACT(YEAR FROM DateGranted) - 若使用ASP.NET,核心逻辑一致,只需调整
Chart控件的配置方式(参考ASP.NET Chart官方文档即可) - 务必确保数据库连接字符串中的服务器、库名等信息与你的实际环境匹配
内容的提问来源于stack exchange,提问作者Lady A
相关产品推荐
相关产品推荐

