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

如何在MySQL中实现透视表,按UserID分组展示用户各日期工时数据

MySQL实现行转列生成工时透视表

固定日期的静态查询方案

如果要展示的日期范围固定,直接用条件聚合即可,假设你的原始表名为working_hours_log,查询语句如下:

SELECT 
    UserID,
    MAX(IF(`Date` = '2021-08-01', `Working Hrs`, NULL)) AS `2021-08-01`,
    MAX(IF(`Date` = '2021-08-02', `Working Hrs`, NULL)) AS `2021-08-02`,
    MAX(IF(`Date` = '2021-08-03', `Working Hrs`, NULL)) AS `2021-08-03`
FROM working_hours_log
GROUP BY UserID
ORDER BY UserID;

逻辑说明

  • 用IF函数对每行数据做日期匹配,匹配成功返回对应工时,失败返回空值
  • 外层用聚合函数(MAX、SUM、MIN均可,只要单用户单日期仅一条数据结果就一致)将同用户的所有日期数据聚合到同一行
  • 最后按UserID分组即可得到目标透视表结构

动态日期的通用方案

如果需要展示的日期不固定,不想每次手动修改查询语句,可以用动态SQL实现:

SET @sql = NULL;
-- 动态生成所有日期对应的查询字段
SELECT GROUP_CONCAT(DISTINCT
    CONCAT('MAX(IF(`Date` = ''', `Date`, ''', `Working Hrs`, NULL)) AS `', `Date`, '`')
) INTO @sql
FROM working_hours_log;

-- 拼接完整查询语句
SET @sql = CONCAT('SELECT UserID, ', @sql, ' FROM working_hours_log GROUP BY UserID ORDER BY UserID');

-- 执行动态SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这个方案会自动读取表中所有存在的日期生成对应列,不需要手动调整代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:27:03