You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:23:22