MySQL:同一字段多条件SELECT查询结果分列展示方案
没问题,我帮你搞定这个需求!这种按维度分组+多条件列展示的场景,用条件聚合(CASE WHEN 配合 SUM/COUNT)是最直接的解决方案,我给你一步步拆解:
核心思路:条件聚合实现多列展示
本质上就是把原本需要多次WHERE查询的结果,通过CASE WHEN在同一个查询里分别计算,最终按用户和日历周分组展示不同类型的工时总和。
步骤1:处理UNIX时间戳转日历周
首先得把你的UNIX时间戳(start/stop)转换成数据库能识别的日期格式,再提取日历周。不同数据库的函数略有差异:
- MySQL:用
FROM_UNIXTIME()转日期,WEEK()提取周数(注意可选参数可以定义周起始,比如周一还是周日) - PostgreSQL:
TO_TIMESTAMP(start)转日期,EXTRACT(WEEK FROM TO_TIMESTAMP(start))提取周数 - SQL Server:
DATEADD(SECOND, start, '1970-01-01')转日期,DATEPART(WK, DATEADD(SECOND, start, '1970-01-01'))提取周数
步骤2:编写条件聚合查询
假设你的工时表名为time_records,字段包括:
user_id:用户IDstart:工时开始UNIX时间戳stop:工时结束UNIX时间戳activity_type:工时类型(比如'project'=项目工时,'driving'=驾驶工时,'break'=休息工时)
下面以MySQL为例,给出完整查询:
SELECT user_id, -- 提取年份+周数,避免跨年周混淆 CONCAT(YEAR(FROM_UNIXTIME(start)), '-W', LPAD(WEEK(FROM_UNIXTIME(start)), 2, '0')) AS calendar_week, -- 项目工时总和:计算符合条件的时长(这里按小时算,也可以改成分钟/秒) SUM(CASE WHEN activity_type = 'project' THEN TIMESTAMPDIFF(HOUR, FROM_UNIXTIME(start), FROM_UNIXTIME(stop)) ELSE 0 END) AS project_hours, -- 驾驶工时总和 SUM(CASE WHEN activity_type = 'driving' THEN TIMESTAMPDIFF(HOUR, FROM_UNIXTIME(start), FROM_UNIXTIME(stop)) ELSE 0 END) AS driving_hours, -- 如果需要其他类型,继续加CASE WHEN即可 SUM(CASE WHEN activity_type = 'break' THEN TIMESTAMPDIFF(HOUR, FROM_UNIXTIME(start), FROM_UNIXTIME(stop)) ELSE 0 END) AS break_hours FROM time_records -- 可选:过滤时间范围 WHERE start >= UNIX_TIMESTAMP('2024-01-01') AND start <= UNIX_TIMESTAMP('2024-12-31') GROUP BY user_id, calendar_week ORDER BY user_id, calendar_week;
关键细节说明
- 时长计算:
TIMESTAMPDIFF(HOUR, start_date, stop_date)是MySQL计算两个日期差的函数,如果你需要更精确的分钟,把HOUR改成MINUTE即可;其他数据库用对应的函数,比如PostgreSQL的EXTRACT(EPOCH FROM (TO_TIMESTAMP(stop) - TO_TIMESTAMP(start)))/3600算小时。 - 跨年周处理:用
年份-周数的格式(比如2024-W05),避免出现不同年份的第5周被合并的问题。 - 自定义条件:如果你的工时类型不是靠
activity_type字段,而是其他条件(比如项目工时是project_id IS NOT NULL,驾驶工时是location LIKE '%vehicle%'),直接把CASE WHEN里的条件改成对应的逻辑就行,比如:SUM(CASE WHEN project_id IS NOT NULL THEN TIMESTAMPDIFF(HOUR, FROM_UNIXTIME(start), FROM_UNIXTIME(stop)) ELSE 0 END) AS project_hours
如果你的数据库不是MySQL,告诉我具体类型,我可以给你调整对应的函数哦!
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

