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

MySQL如何合并无空字段行 拆分排班时段避免生成冗余行

解决方案

核心思路

通过交叉连接(CROSS JOIN)2行的临时序列,将原表每条员工排班记录自动拆分为2行,再通过条件判断生成对应拆分后的时段,单次查询即可得到目标结果,无需多次插入产生冗余数据。

适用MySQL 5.x/8.0 通用代码

直接查询得到目标结果

SELECT 
    s.staff_id,
    s.Name,
    -- 拆分周一的时段,可根据实际规则调整CASE条件
    CASE
        WHEN seg_num = 1 AND s.Monday = '8:00am-5:00pm' THEN '8:00am-1:00pm'
        WHEN seg_num = 2 AND s.Monday = '8:00am-5:00pm' THEN '2:00pm-5:00pm'
        WHEN seg_num = 1 AND s.Monday = '9:00am-6:00pm' THEN '9:00am-2:00pm'
        WHEN seg_num = 2 AND s.Monday = '9:00am-6:00pm' THEN '3:00pm-6:00pm'
    END AS Monday,
    -- 拆分周二的时段,可根据实际规则调整CASE条件
    CASE
        WHEN seg_num = 1 AND s.Tuesday = '9:00am-6:00pm' THEN '9:00am-2:00pm'
        WHEN seg_num = 2 AND s.Tuesday = '9:00am-6:00pm' THEN '3:00pm-6:00pm'
        WHEN seg_num = 1 AND s.Tuesday = '7:00am-4:00pm' THEN '7:00am-12:00pm'
        WHEN seg_num = 2 AND s.Tuesday = '7:00am-4:00pm' THEN '1:00pm-4:00pm'
    END AS Tuesday
FROM 
    你的原表名 s
CROSS JOIN (
    -- 生成2行的拆分序列,对应上下午两个时段
    SELECT 1 AS seg_num UNION ALL
    SELECT 2 AS seg_num
) AS split_segments
ORDER BY s.staff_id, seg_num;

一次性写入新表

如果需要将结果持久化到新表,直接在查询前加插入语句即可:

-- 先创建结构匹配的新表(可根据实际需求调整字段)
CREATE TABLE 新表名 LIKE 你的原表名;

-- 一次性插入拆分后的所有数据
INSERT INTO 新表名 (staff_id, Name, Monday, Tuesday)
SELECT 
    s.staff_id,
    s.Name,
    CASE
        WHEN seg_num = 1 AND s.Monday = '8:00am-5:00pm' THEN '8:00am-1:00pm'
        WHEN seg_num = 2 AND s.Monday = '8:00am-5:00pm' THEN '2:00pm-5:00pm'
        WHEN seg_num = 1 AND s.Monday = '9:00am-6:00pm' THEN '9:00am-2:00pm'
        WHEN seg_num = 2 AND s.Monday = '9:00am-6:00pm' THEN '3:00pm-6:00pm'
    END AS Monday,
    CASE
        WHEN seg_num = 1 AND s.Tuesday = '9:00am-6:00pm' THEN '9:00am-2:00pm'
        WHEN seg_num = 2 AND s.Tuesday = '9:00am-6:00pm' THEN '3:00pm-6:00pm'
        WHEN seg_num = 1 AND s.Tuesday = '7:00am-4:00pm' THEN '7:00am-12:00pm'
        WHEN seg_num = 2 AND s.Tuesday = '7:00am-4:00pm' THEN '1:00pm-4:00pm'
    END AS Tuesday
FROM 
    你的原表名 s
CROSS JOIN (
    SELECT 1 AS seg_num UNION ALL
    SELECT 2 AS seg_num
) AS split_segments
ORDER BY s.staff_id, seg_num;

说明

  • 请将代码中的你的原表名、新表名替换为实际使用的表名。
  • 若后续有更多拆分时段需求,只需在split_segments子查询中新增对应行即可,无需修改核心逻辑。
  • 处理数千条数据仅需单次执行,无冗余插入操作,执行效率远高于多次INSERT方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:36:02