sql - 具有多个日期字段的每个日期的 SQL COUNT
问题描述
我有下表和查询,它没有给出正确的结果。
JOB 表有 Open、Finish 和 Closed 日期。
现在我需要按每个日期和位置在所选日期组之间提取打开、已完成和已关闭作业的计数。
请帮助我得到如下预期结果中的结果
+-------+-----------+------------+-----------+----------+
| JOB_id| DateOpen | DateFinish | DateClose | Location |
+-------+-----------+------------+-----------+----------+
| 100 | 16-Dec-18 | 18-Dec-18 | 19-Dec-18 | A |
| 101 | 16-Dec-18 | 18-Dec-18 | 19-Dec-18 | A |
| 102 | 17-Dec-18 | 19-Dec-18 | 20-Dec-18 | C |
| 103 | 10-Dec-18 | 11-Dec-18 | 16-Dec-18 | D |
| 104 | 17-Dec-18 | 19-Dec-18 | 18-Dec-18 | E |
+-------+-----------+------------+-----------+----------+
询问:
SELECT count(DateOpen) as Opened,
count(DateFinish) as Finised,
count(DateClose) as Closed,
(DateOpen) as Date
FROM JOBS
WHERE DateOpen BETWEEN '12/16/2018' AND DATEADD(DAY, 1, '12/17/2018')
group by DateOpen
预期结果:
+-----------+------+----------+--------+----------+
| Date | Open | Finished | Closed | Location |
+-----------+------+----------+--------+----------+
| 16-Dec-18 | 2 | 0 | 0 | A |
| 16-Dec-18 | 0 | 0 | 1 | D |
| 17-Dec-18 | 1 | 0 | 0 | C |
| 17-Dec-18 | 1 | 0 | 0 | E |
+-----------+------+----------+--------+----------+
解决方案
您可以将所有打开、完成和关闭日期放在一个列中,然后将其加入您的工作表:
DECLARE @date1 AS DATE = '2018-12-16';
DECLARE @date2 AS DATE = '2018-12-17';
WITH dates(date) AS (
SELECT DateOpen FROM jobs
UNION
SELECT DateFinish FROM jobs
UNION
SELECT DateClose FROM jobs
)
SELECT dates.date
, Location
, COUNT(CASE WHEN dates.date = DateOpen THEN 1 END) AS Opened
, COUNT(CASE WHEN dates.date = DateFinish THEN 1 END) AS Finished
, COUNT(CASE WHEN dates.date = DateClose THEN 1 END) AS Closed
FROM dates
LEFT JOIN jobs ON dates.date IN (DateOpen, DateFinish, DateClose)
WHERE dates.date BETWEEN @date1 AND @date2
GROUP BY dates.date
, Location
结果:
| date | Location | Opened | Finished | Closed |
|------------|----------|--------|----------|--------|
| 16/12/2018 | A | 2 | 0 | 0 |
| 16/12/2018 | D | 0 | 0 | 1 |
| 17/12/2018 | C | 1 | 0 | 0 |
| 17/12/2018 | E | 1 | 0 | 0 |
推荐阅读
- go - 超时停止 goroutine 执行
- c++ - C++ 函数调用失败
- javascript - 获取将组复选框更改为数组的值
- python - 将 cython 包分发为没有 c 文件的轮子
- path - 为 Linux 共享 PATH 制作一个 Debian Windows 子系统
- file - 尝试将 .dat 文件转换为可用文本
- java - javaFX中如何添加和刷新一组ImageViews
- linq - Linq 查询获取产品列表,每个产品都有一个标识符列表和一个属性列表
- c++ - 为什么 long 在查找三个整数的第二个最大值时会显示错误的输出?
- sql - SELECT DISTINCT COUNT 语句中的重复记录