【问题标题】:count values with yes and not in sql statement在 sql 语句中用 yes 和 not 计算值
【发布时间】:2016-03-05 23:13:31
【问题描述】:

我有一张表格,里面有这样的数据:

 USER  NAME     Timestamp               EXECUTED    CLOSED
1 user1 JOHN DOE 2015-11-23 12:50:45         Yes       Yes
2 user1 JOHN DOE 2015-11-23 12:52:35         Yes       Yes
3 user1 JOHN DOE 2015-11-23 12:53:52         Yes       Yes
4 user1 JOHN DOE 2015-11-23 12:54:59         Yes       Yes
5 user1 JOHN DOE 2015-11-23 12:56:04         Yes       Yes
6 user1 JOHN DOE 2015-11-23 18:09:37         Yes       No
7 user1 JOHN DOE 2015-11-23 18:15:46         Yes       Yes
8 user1 JOHN DOE 2015-11-23 18:17:02         Yes       Yes

我想准备一份这样的报告:

USER   NAME      EXECUTED  CLOSED  NOTCLOSED
user1  JOHN DOE    8         7         1

我尝试过这样的事情:

SELECT USER, NAME, Timestamp, count(EXECUTED), count(CLOSED) 
FROM table 
WHERE Timestamp LIKE "2015-11-23%" 
AND EXECUTED = "Yes" 
AND CLOSED = "Yes"

但在这种情况下的结果永远显示:

EXECUTED    CLOSED
8           8

当我有 1 条 Closed = No 的记录时。 我知道当我计算列 EXECUTED 和 CLOSED 时,我无法使用 WHERE = YES/NO 正确评估,因为数据类型更改为整数,但我找不到合适的解决方案。

其他事情:如何向“NO CLOSE”列显示正确的值? (EXECUTED 和 CLOSED 的区别)

【问题讨论】:

    标签: sql sqlite aggregate-functions


    【解决方案1】:

    这样的事情应该可以工作:

    ;WITH counts AS (
        SELECT USER
              ,NAME
              ,Timestamp
              ,SUM(CASE WHEN EXECUTED = "YES" THEN 1 ELSE 0 END) AS NumExecuted
              ,SUM(CASE WHEN CLOSED = "YES" THEN 1 ELSE 0 END) AS NumClosed
        FROM table 
        WHERE Timestamp LIKE "2015-11-23%" 
    )
    SELECT USER
          ,NAME
          ,Timestamp
          ,NumExecuted
          ,NumClosed
          ,NumExecuted - NumClosed AS NumOpen
    FROM counts
    

    【讨论】:

    • 为什么要在 WITH 前面加分号?
    • COUNT() 计算所有非 NULL 值,因此它也很乐意计算 0 值。您需要 NULL 或不同的聚合函数。
    • @CL 是的,当然。我的意思是 SUM,而不是 COUNT(已编辑)。我出于习惯添加了分号,以确保在启动 CTE(公用表表达式)之前终止任何先前的语句。不过,在这个例子中完全没有必要。
    • 那为什么要把它留在那里(并省略终止分号)?
    • 查看 Aaron Bertrand 对同一问题的回复:dba.stackexchange.com/a/23374
    【解决方案2】:
    select user, name,
        sum(case when executed = 'Yes' then 1 else 0 end) as executed,
        sum(case when closed = 'Yes' then 1 else 0 end) as closed,
        sum(case when executed = 'Yes' and closed = 'No' then 1 else 0 end) as notclosed
    from user
    group by user, name
    

    【讨论】:

    • 完美运行!谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多