如何编写多条件SQL查询以提取指定日期的员工出行模式数据
满足要求的SQL查询实现
可以编写符合所有条件的SQL查询,核心是验证同一员工在指定两个日期的出行模式是否完全匹配规则。以下是两种可行的实现方式:
方式一:自关联+存在性校验
假设你的表名为employee_travel,包含字段employee_id(员工ID)、travel_date(出行日期)、travel_mode(出行模式),查询语句如下:
SELECT t1.employee_id, t1.travel_date AS jan_31_date, t1.travel_mode AS jan_31_mode, t2.travel_date AS feb_28_date, t2.travel_mode AS feb_28_mode FROM employee_travel t1 INNER JOIN employee_travel t2 ON t1.employee_id = t2.employee_id WHERE t1.travel_date = '2023-01-31' AND t1.travel_mode = 'BUS' AND t2.travel_date = '2023-02-28' AND t2.travel_mode = 'CAR' -- 确保2023-02-28该员工没有其他出行模式的记录 AND NOT EXISTS ( SELECT 1 FROM employee_travel t3 WHERE t3.employee_id = t1.employee_id AND t3.travel_date = '2023-02-28' AND t3.travel_mode != 'CAR' )
逻辑说明
- 通过自关联获取同一员工在两个目标日期的记录,筛选出1月31日为
BUS、2月28日为CAR的基础匹配项 NOT EXISTS子句用于排除那些在2月28日存在非CAR出行模式的员工,严格满足“仅为CAR”的要求- 最终返回符合所有规则的员工在两个日期的出行数据
方式二:分组聚合校验
如果需要按员工维度汇总结果,也可以使用分组聚合的方式:
SELECT employee_id, MAX(CASE WHEN travel_date = '2023-01-31' THEN travel_mode END) AS jan_31_mode, MAX(CASE WHEN travel_date = '2023-02-28' THEN travel_mode END) AS feb_28_mode FROM employee_travel WHERE travel_date IN ('2023-01-31', '2023-02-28') GROUP BY employee_id HAVING MAX(CASE WHEN travel_date = '2023-01-31' THEN travel_mode END) = 'BUS' AND MAX(CASE WHEN travel_date = '2023-02-28' THEN travel_mode END) = 'CAR' -- 确保2月28日仅存在CAR一种出行模式 AND COUNT(DISTINCT CASE WHEN travel_date = '2023-02-28' THEN travel_mode END) = 1
逻辑说明
- 先筛选出仅包含两个目标日期的数据,按员工分组
- 通过
HAVING子句中的聚合条件,验证1月31日模式为BUS、2月28日模式为CAR,同时确保2月28日该员工的出行模式唯一(即仅为CAR)
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

