使用不同的日期集在SQL中查找计数

时间:2018-12-17 16:20:26

标签: sql sql-server tsql sql-server-2014

我在下面的查询中基于不同的日期字段查找计数。

如何获得低于预期结果的结果?

显示的查询没有像样本结果一样返回实际计数。

+-------+-----------+------------+-----------+----------+
| 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        |
+--------+----------+--------+----------+

3 个答案:

答案 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
*/

最好的问候

瑞秋