You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将行列格式的排班表转换为数据库友好格式

解决方案:宽排班表转数据库友好的长格式

你遇到的是典型的**宽表转长表(逆透视/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

火山引擎 最新活动