如何用SQL GROUP BY处理pdays数据的工作日/周末时长统计
解决方案:按type_id分组计算工作日/周末time总和
先明确你的原始数据集:
| id | time | date_time | type_id |
|---|---|---|---|
| 1 | 2 | 2016-03-05 | 1 |
| 2 | 5 | 2016-03-05 | 1 |
| 3 | 3 | 2016-03-06 | 2 |
| 4 | 7 | 2016-03-07 | 3 |
| 5 | 2 | 2016-03-10 | 1 |
| 6 | 1 | 2016-03-12 | 3 |
你的需求是按type_id分组,计算指定周末日期(日数为5,6,12,13,19,20,26,27)和工作日的time总和,期望输出:
| type_id | weekday_time | weekends_time |
|---|---|---|
| 1 | 7 | 2 |
| 2 | 3 | 0 |
| 3 | 7 | 1 |
实现思路&代码
完全贴合你提到的思路,我们用SQL的条件判断+分组聚合就能搞定:
- 从
date_time里提取日数:用DAY(date_time)函数拿到日期的日部分 - 判断日数是否在指定的周末集合里,分别累加对应的
time值 - 按
type_id分组,得到每个类型的工作日/周末时间总和
具体SQL代码如下:
SELECT type_id, -- 工作日时间总和:日数不在周末集合就累加time,否则加0 SUM(CASE WHEN DAY(date_time) NOT IN (5,6,12,13,19,20,26,27) THEN time ELSE 0 END) AS weekday_time, -- 周末时间总和:日数在周末集合就累加time,否则加0 SUM(CASE WHEN DAY(date_time) IN (5,6,12,13,19,20,26,27) THEN time ELSE 0 END) AS weekends_time FROM pdays GROUP BY type_id ORDER BY type_id;
代码解释
- 第一个
CASE语句:筛选出非周末的记录,把它们的time加起来,没有符合条件的记录就返回0,对应weekday_time - 第二个
CASE语句:筛选出周末的记录,累加它们的time,没有符合条件的记录就返回0,对应weekends_time GROUP BY type_id保证我们按类型分组计算,ORDER BY type_id让结果和你期望的输出顺序一致
跑这段代码就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者HHKSHD_HH
相关产品推荐
相关产品推荐

