我在下面的查询中基于不同的日期字段查找计数。
如何获得低于预期结果的结果?
显示的查询没有像样本结果一样返回实际计数。
+-------+-----------+------------+-----------+----------+
| WO_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 |
+-------+-----------+------------+-----------+----------+
查询(选择标准:仅适用于2018年12月16日数据):
SELECT
COUNT(DateOpen) AS Opened,
COUNT(DateClose) AS closed,
COUNT(DateFinish) AS finished,
Location
FROM
JOB
WHERE
JOB.DateOpen BETWEEN '12/16/2018' AND DATEADD(DAY, 1, '12/16/2018')
OR JOB.DateClose BETWEEN '12/16/2018' AND DATEADD(DAY, 1, '12/16/2018')
OR JOB.DateFinish BETWEEN '12/16/2018' AND DATEADD(DAY, 1, '12/16/2018')
GROUP BY
Location
预期结果:
+--------+----------+--------+----------+
| opened | finished | closed | Location |
+--------+----------+--------+----------+
| 2 | 0 | 0 | A |
| 0 | 0 | 1 | D |
+--------+----------+--------+----------+
答案 0 :(得分:2)
SUM和CASE有一个技巧,您可以在case符合条件时使用case选择1,否则选择0,然后求和以“计数”这些项目-(因为求和0或null就像不计数一样) )。这是代码:
SELECT
SUM(CASE WHEN JOB.DateOpen BETWEEN '12/16/2018' AND DATEADD(DAY, 1, '12/16/2018') THEN 1 ELSE 0 END) AS opened,
SUM(CASE WHEN JOB.DateFinish BETWEEN '12/16/2018' AND DATEADD(DAY, 1, '12/16/2018') THEN 1 ELSE 0 END) AS finished,
SUM(CASE WHEN JOB.DateClose BETWEEN '12/16/2018' AND DATEADD(DAY, 1, '12/16/2018') THEN 1 ELSE 0 END) AS closed,
location
FROM JOB
group by Location
答案 1 :(得分:2)
这应该为您提供所需的结果。它仅返回与特定日期条件匹配的行。当前构建查询的方式将导致它还会拉入与2018年12月17日匹配的行。您可以在这里进行测试:https://rextester.com/MHT79618
DECLARE @SelectionDate DATETIME = '12/16/2018'
SELECT
SUM (CASE WHEN DateOpen = @SelectionDate THEN 1 ELSE 0 end) as Opened
,SUM (CASE WHEN DateClose = @SelectionDate THEN 1 ELSE 0 end)as closed
,SUM (CASE WHEN DateFinish = @SelectionDate THEN 1 ELSE 0 end)as finished
,Location
FROM JOB
WHERE JOB.DateOpen = @SelectionDate
or JOB.DateClose = @SelectionDate
or JOB.DateFinish = @SelectionDate
group by Location
edit 该死,只是看到Hogan在我打字时回答了基本相同的答案。
答案 2 :(得分:0)
在您的原始脚本中,您计算了所有行,我认为您的条件可能不正确。请尝试以下脚本。
create table JOB
(WO_id int,
DateOpen date,
DateFinish date,
DateClose date,
Location varchar(20))
insert into JOB values
(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')
;with cte as (
SELECT
CASE WHEN DateOpen = '12/16/2018' THEN 1 ELSE 0 end as Opened,
CASE WHEN DateClose = '12/16/2018' THEN 1 ELSE 0 end as closed,
CASE WHEN DateFinish = '12/16/2018' THEN 1 ELSE 0 end as finished,
Location
FROM JOB )
select sum(Opened) as Opened,sum(closed) as closed,sum(finished) as finished,Location
from cte
WHERE Opened <>0 or closed<>0 or finished <>0
group by Location
/*
Opened closed finished Location
----------- ----------- ----------- --------------------
2 0 0 A
0 1 0 D
*/
最好的问候
瑞秋