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

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:用户ID
  • start:工时开始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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:24:58