我有这个名为pdays的数据:
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分组的工作日和周末的平均时间(时间)
输出期望如下:
type_id| weekday_time|weekends_time
1 7 2
2 3 0
3 7 1
这是我的想法:
首先我需要从date_time中提取日期编号;第二,确定日期编号是否属于(5,6,12,13,19,20,26,27),这是周末数字(注意:这个数据表示一个月的情况,所以我不需要担心下个月周末日期数的变化);最后,在type_id上进行聚合和分组
CASE WHEN pday.date IN(5,6,12,13,19,20,26,27) THEN 'weekend' ELSE 'weekday' END
这是我认为我应该使用的案例部分。
答案 0 :(得分:1)
首先,您的输出似乎是错误的。 Type_id 3同时包含周末和工作日条目,但您将其中一个输出值显示为0。
这应该可以在SQL Server中获得您想要的内容,并且它非常接近其他RDBMS。如果您更新了RBDMS,我将更改:
;with cte AS (
select type_id,
CASE WHEN pday.date IN(5,6,12,13,19,20,26,27) THEN 'weekday' ELSE 'weekend' END AS day_type,
SUM(time) AS time_sum
FROM pdays
GROUP BY
type_id,
CASE WHEN pday.date IN(5,6,12,13,19,20,26,27) THEN 'weekday' ELSE 'weekend' END
)
SELECT type_id,
SUM(CASE WHEN day_type = 'weekday' THEN time_sum ELSE 0 END) AS 'weekday_time',
SUM(CASE WHEN day_type = 'weekend' THEN time_sum ELSE 0 END) AS 'weekend_time'
FROM cte
GROUP BY [type_id]