【问题标题】:Why doesn't INTEGER/INTEGER does not give me an answer in SQL?为什么 INTEGER/INTEGER 没有在 SQL 中给我答案?
【发布时间】:2019-11-30 13:25:52
【问题描述】:

我正在尝试查找在 SQL 中接收到的消息的成功率。因此,我创建了一个带有消息 ID 和操作(发送或接收)的表,然后我计算编号。收到的消息/总数的消息。这是我的代码:

CREATE TABLE msg (id INTEGER, action TEXT);
INSERT INTO msg VALUES (1, 'sent');
INSERT INTO msg VALUES (1, 'received');
INSERT INTO msg VALUES (2, 'sent');
INSERT INTO msg VALUES (2, 'received');
INSERT INTO msg VALUES (3, 'sent');
INSERT INTO msg VALUES (4, 'sent');
INSERT INTO msg VALUES (5, 'sent');

SELECT SUM(CASE WHEN action = 'received' THEN 1 ELSE 0 END)/COUNT( DISTINCT id) AS success_rate FROM msg;

这给了我 0 作为输出。为什么?

【问题讨论】:

  • (1) 用您正在使用的数据库标记您的问题。 (2) id 不是唯一的,这似乎很奇怪。

标签: sql sqldatatypes


【解决方案1】:

因为您的数据库执行整数除法。简单加个小数点:

SELECT SUM(CASE WHEN action = 'received' THEN 1.0 ELSE 0 END) / COUNT(DISTINCT id) AS success_rate
FROM msg;

我可能想除以发送的数字——以防万一:

SELECT (SUM(CASE WHEN action = 'received' THEN 1.0 ELSE 0 END) /
        SUM(CASE WHEN action = 'sent' THEN 1.0 END)
       ) AS success_rate
FROM msg;

或在这两种情况下通过唯一帐户:

SELECT (COUNT(DISTINCT CASE WHEN action = 'received' THEN id END) /
        COUNT(DISTINCT id)
       ) AS success_rate
FROM msg;

如果id 是独一无二的(我觉得这很合理),这可以简化为:

SELECT AVG(CASE WHEN action = 'received' THEN 1.0 ELSE 0 END) AS success_rate
FROM msg;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多