如何在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
相关产品推荐
相关产品推荐

