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

考勤表开发:如何将SQL表列值合并为单行并在DataGridView展示

嘿,这个需求我之前帮不少做考勤系统的朋友解决过,其实分两步走就搞定:先在SQL里把目标列的所有值合并成单行,再把结果绑定到DataGridView就行。我给你详细拆解下~

第一步:SQL中合并列值到单行

不同数据库的合并语法略有不同,我把常用的几种情况都列出来,你对应自己的数据库来用:

1. SQL Server 2017+ / PostgreSQL

用STRING_AGG函数,语法简单直观,还能指定排序:

-- 合并Attendance表的EmployeeName列,用逗号+空格分隔,按名字排序
SELECT STRING_AGG(EmployeeName, ', ') WITHIN GROUP (ORDER BY EmployeeName) AS MergedNames
FROM Attendance;

如果不需要排序,直接去掉WITHIN GROUP部分就行:

SELECT STRING_AGG(EmployeeName, ', ') AS MergedNames FROM Attendance;

2. MySQL / MariaDB

用GROUP_CONCAT函数,同样支持排序和自定义分隔符:

SELECT GROUP_CONCAT(EmployeeName ORDER BY EmployeeName SEPARATOR ', ') AS MergedNames
FROM Attendance;

3. Oracle

用LISTAGG函数:

SELECT LISTAGG(EmployeeName, ', ') WITHIN GROUP (ORDER BY EmployeeName) AS MergedNames
FROM Attendance;

4. 旧版SQL Server(2016及以前)

如果你的SQL Server版本比较老,没有STRING_AGG,可以用STUFF+FOR XML PATH的组合写法:

SELECT STUFF(
    (SELECT ', ' + EmployeeName FROM Attendance FOR XML PATH('')),
    1, 2, ''
) AS MergedNames;

原理是先通过FOR XML PATH('')把所有行拼接成一个字符串,再用STUFF去掉开头多余的逗号和空格。

小提示

如果列里有NULL值,可以用ISNULL(SQL Server)或COALESCE(通用)替换成默认文本,避免合并后出现空值:

-- SQL Server示例:把NULL换成"未登记"
SELECT STRING_AGG(ISNULL(EmployeeName, '未登记'), ', ') AS MergedNames FROM Attendance;
第二步:在DataGridView中展示结果

假设你用的是C# WinForms,直接把SQL查询的结果绑定到DataGridView就可以,给你一个完整的代码示例:

using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

// 注意:替换成你自己的数据库连接字符串
string connectionString = "Server=你的服务器地址;Database=你的考勤数据库名;Integrated Security=True;";

try
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        // 这里用SQL Server的STRING_AGG语句,根据你的数据库替换成对应SQL
        string sqlQuery = "SELECT STRING_AGG(EmployeeName, ', ') AS MergedNames FROM Attendance;";
        SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlQuery, conn);
        DataTable resultTable = new DataTable();
        dataAdapter.Fill(resultTable);
        
        // 绑定到DataGridView
        dataGridView1.DataSource = resultTable;
        
        // 自定义列标题,让考勤表更直观
        if (dataGridView1.Columns["MergedNames"] != null)
        {
            dataGridView1.Columns["MergedNames"].HeaderText = "考勤人员名单";
        }
        
        // 如果想让内容自动换行(比如用换行符分隔时),可以加上这两句
        dataGridView1.Columns["MergedNames"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
        dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
    }
}
catch (Exception ex)
{
    MessageBox.Show("加载数据出错:" + ex.Message);
}

额外优化

如果你的考勤表是按日期分组的(比如每天的考勤名单),可以在SQL里加GROUP BY,比如:

-- SQL Server示例:按日期分组合并当天的考勤人员
SELECT 
    AttendanceDate,
    STRING_AGG(EmployeeName, ', ') WITHIN GROUP (ORDER BY EmployeeName) AS DailyAttendees
FROM Attendance
GROUP BY AttendanceDate;

这样绑定到DataGridView后,就能看到每天对应的考勤人员名单,更符合实际考勤表的需求。


内容的提问来源于stack exchange,提问作者Junior Tekkis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:42:38