如何将行列格式的排班表转换为数据库友好格式
解决方案:宽排班表转数据库友好的长格式
你遇到的是典型的**宽表转长表(逆透视/Unpivot)**需求——把多列的属性(这里是日期)转换成单独的行记录,这种格式更适配数据库存储和后续分析。下面给你几个不同工具场景下的实用实现方法:
1. Excel/Google Sheets 快速可视化转换
Excel 用 Power Query(推荐给非编程用户)
操作简单直观,无需写公式:
- 选中你的排班数据区域,点击「数据」选项卡 → 「从表格/范围」(确认勾选「我的表格有标题」)
- 在Power Query编辑器中,选中所有日期列(Aug-01、Aug-02、Aug-03)
- 点击「转换」选项卡 → 「逆透视列」→ 「逆透视其他列」
- 最后点击「关闭并上载」,就能直接得到你要的长格式表格
Google Sheets 用数组公式一键生成
如果用Google Sheets,在空白单元格(比如A6)输入以下公式(假设原始数据在A1:D4):
=ARRAYFORMULA(SPLIT(FLATTEN(A2:A4&"|"&B1:D1&"|"&B2:D4), "|"))
FLATTEN会把姓名、日期、岗位的组合内容压缩成一列,用|做分隔符SPLIT再把分隔后的内容拆成三列,自动生成所有行记录
2. Python 脚本(适合批量/自动化处理)
如果需要处理大量数据或者搭建自动化流程,用Pandas的melt函数是最优解:
import pandas as pd # 构造原始数据(也可以从CSV/Excel读取:pd.read_excel("排班表.xlsx")) df = pd.DataFrame({ "姓名": ["Bob", "Paul", "Sarah", "Lily"], "Aug-01": ["Kitchen", "Prep", "Serving", "Off"], "Aug-02": ["Prep", "Off", "Kitchen", "Serving"], "Aug-03": ["Off", "Serving", "Prep", "Kitchen"] }) # 执行逆透视转换 unpivoted_df = df.melt( id_vars="姓名", # 保留不转换的核心列 var_name="日期", # 新生成的日期列名称 value_name="岗位安排" # 新生成的岗位列名称 ) # 查看转换结果 print(unpivoted_df) # 保存为CSV文件(可直接导入数据库) unpivoted_df.to_csv("排班表_长格式.csv", index=False)
3. SQL 直接转换(数据已在数据库中)
如果你的排班表已经存储在数据库里,用UNION ALL拆分每一列即可:
SELECT 姓名, 'Aug-01' AS 日期, Aug-01 AS 岗位安排 FROM 排班表 UNION ALL SELECT 姓名, 'Aug-02' AS 日期, Aug-02 AS 岗位安排 FROM 排班表 UNION ALL SELECT 姓名, 'Aug-03' AS 日期, Aug-03 AS 岗位安排 FROM 排班表 ORDER BY 日期, 姓名;
如果日期列数量很多,可以用动态SQL自动生成UNION ALL语句,避免手动重复编写。
关键搜索关键词
以后遇到类似需求,可以用这些关键词精准搜索解决方案:
- 宽表转长表
- 逆透视(Unpivot)
- Pandas melt
- Excel 逆透视
内容的提问来源于stack exchange,提问作者Razgrease




