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

如何实现员工排班数据的行分组紧凑展示?

员工排班数据行转列紧凑展示解决方案

核心逻辑

要将同一员工的不同日期排班合并到同一行,本质是行转列操作,下面提供两种通用实现方式,适配多数数据库环境。

通用兼容写法(支持MySQL、PostgreSQL、SQL Server等)

假设你的数据表中,员工ID为emp_id、姓名为emp_name,排班日期为planning_date、时段为shift_time,可通过CASE WHEN配合聚合函数实现:

SELECT
    e.emp_id,
    e.emp_name,
    MAX(CASE WHEN p.planning_date = '2024-05-01' THEN p.shift_time END) AS "2024-05-01",
    MAX(CASE WHEN p.planning_date = '2024-05-02' THEN p.shift_time END) AS "2024-05-02",
    MAX(CASE WHEN p.planning_date = '2024-05-03' THEN p.shift_time END) AS "2024-05-03",
    -- 根据实际需要添加更多日期列
    MAX(CASE WHEN p.planning_date = '2024-05-07' THEN p.shift_time END) AS "2024-05-07"
FROM T_EMPLOYEES e
LEFT JOIN T_PLANNINGS p ON e.emp_id = p.emp_id
-- 若有其他关联表,在此补充JOIN条件
GROUP BY e.emp_id, e.emp_name
ORDER BY e.emp_id;

关键说明

  • CASE WHEN会匹配对应日期的排班时段,MAX聚合函数用于分组后保留该日期的有效时段(避免同一员工同一日期多条记录导致的空值或重复)
  • 若排班日期是动态的(无法提前枚举),需用动态SQL生成列:
    • MySQL:用GROUP_CONCAT拼接CASE语句,再通过PREPARE+EXECUTE执行
    • SQL Server:用STRING_AGG生成动态列列表,配合EXEC执行
    • PostgreSQL:用string_agg生成动态SQL,通过EXECUTE执行

原生PIVOT语法示例(以SQL Server/Oracle为例)

如果使用支持PIVOT的数据库,写法更简洁:

SELECT emp_id, emp_name, [2024-05-01], [2024-05-02], [2024-05-03], [2024-05-07]
FROM (
    -- 子查询获取基础关联数据
    SELECT e.emp_id, e.emp_name, p.planning_date, p.shift_time
    FROM T_EMPLOYEES e
    LEFT JOIN T_PLANNINGS p ON e.emp_id = p.emp_id
    -- 补充其他关联表逻辑
) AS SourceData
PIVOT (
    MAX(shift_time)
    -- 指定要转成列的日期值
    FOR planning_date IN ([2024-05-01], [2024-05-02], [2024-05-03], [2024-05-07])
) AS PivotResult
ORDER BY emp_id;

注意事项

  1. 若同一员工同一日期存在多条排班记录,需先处理重复数据(如取合并时段、最早/最晚时段)
  2. 确保planning_date的格式与查询中使用的日期字符串格式完全匹配,避免匹配失败
  3. 动态日期场景下,需先查询出所有需要展示的日期范围,再动态生成列列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:52:39