【问题标题】:Find count in SQL using different set of dates使用不同的日期集在 SQL 中查找计数
【发布时间】:2018-12-17 16:20:25
【问题描述】:

我有以下查询来查找基于不同日期字段的计数。

我怎样才能得到如下预期的结果?

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

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

【问题讨论】:

  • 您的问题到底是什么?你还没问过。
  • 我怎样才能得到预期结果中的结果
  • 这里要小心。这些日期字符串 cab 会根据您的连接日期格式设置进行不同的解释。最好对字符串文字使用明确的符合 ANSI 标准的 YYYYMMDD 格式。

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


【解决方案1】:

SUM 和 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

【讨论】:

    【解决方案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
    

    编辑该死,刚看到霍根在我打字的时候回答,答案基本相同。

    【讨论】:

    • :( 很抱歉——我也遇到了同样的情况。给你一个 +1 使用参数:)
    • 如何获取每个日期的计数?
    • 我很困惑。您的问题非常明确地基于一个日期。您是说要计算每个可能的日期吗?
    【解决方案3】:

    在您的原始脚本中,您计算​​了所有行,我认为您的条件可能不正确。请尝试以下脚本。

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

    最好的问候,

    雷切尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-23
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多