如何编写SQL查询分列展示工作日与周末的工单总量?
工作日与周末工单量统计SQL优化方案
问题描述
我需要对比2023年1月至12月工单数据集中周末与工作日的工单量。当前使用的SQL查询如下:
SELECT DATENAME(DW, Created_time) AS Daily_Volume, COUNT(DISTINCT Ticket_ID) AS Total_Request FROM [SLA DB].[dbo].[data_challenge] GROUP BY DATENAME(DW, Created_time)
该查询返回了全年每周各天的累计工单量,但我希望将工作日和周末的工单总量分别放在独立的列中,请问如何编写SQL查询实现这一需求?
示例数据集
| Ticket_ID | Priority | Source | Created_time |
|---|---|---|---|
| 1012 | Low | 2023-01-02 00:58:00.0000000 | |
| 1013 | High | Phone | 2023-01-02 07:27:00.0000000 |
| 1014 | Low | Chat | 2023-01-02 06:59:00.0000000 |
| 1015 | Medium | 2023-01-03 03:09:00.0000000 | |
| 1016 | Low | 2023-01-03 00:03:00.0000000 |
解决方案
可以通过条件聚合实现需求,用CASE语句区分工作日和周末,分别统计工单总量:
方案一:通过星期名称判断
SELECT COUNT(DISTINCT CASE WHEN DATENAME(DW, Created_time) NOT IN ('Saturday', 'Sunday') THEN Ticket_ID END) AS 工作日工单总量, COUNT(DISTINCT CASE WHEN DATENAME(DW, Created_time) IN ('Saturday', 'Sunday') THEN Ticket_ID END) AS 周末工单总量 FROM [SLA DB].[dbo].[data_challenge] WHERE Created_time BETWEEN '2023-01-01' AND '2023-12-31 23:59:59.999'
方案二:通过星期数字判断(适配不同SQL Server配置)
如果你的SQL Server将周日设为星期1,周一到周五对应2-6,周六对应7,可以用数字判断:
SELECT COUNT(DISTINCT CASE WHEN DATEPART(WEEKDAY, Created_time) BETWEEN 2 AND 6 THEN Ticket_ID END) AS 工作日工单总量, COUNT(DISTINCT CASE WHEN DATEPART(WEEKDAY, Created_time) IN (1,7) THEN Ticket_ID END) AS 周末工单总量 FROM [SLA DB].[dbo].[data_challenge] WHERE Created_time BETWEEN '2023-01-01' AND '2023-12-31 23:59:59.999'
关键说明
CASE语句根据星期属性筛选工单,仅符合条件的Ticket_ID会被计入对应列的统计COUNT(DISTINCT ...)保证每个工单ID只被统计一次,避免重复计数WHERE条件限定了2023年全年的数据范围,确保统计结果精准
内容的提问来源于stack exchange,提问作者Bashiru Otokiti
相关产品推荐
相关产品推荐

