mysql在使用sum(条件1时为case)和count(条件1时为case)时得到不同的结果

tjvv9vkg  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(306)

我使用下面的查询对行进行计数,我想知道当我在查询中使用sum()时,它返回correct,但当我使用count return false时。我完成了这项工作,但我需要这个进一步发展自己的澄清

SELECT SUM(CASE 
         WHEN g.branchid=30  THEN 1
         ELSE 0
       END) AS count FROM `liverates` l LEFT JOIN branch b ON b.warehouseid=l.warehouseid LEFT JOIN `group` g ON l.warehouseid=g.warehouseid

SELECT COUNT(CASE 
         WHEN g.branchid=30  THEN 1
         ELSE 0
       END) AS count FROM `liverates` l LEFT JOIN branch b ON b.warehouseid=l.warehouseid LEFT JOIN `group` g ON l.warehouseid=g.warehouseid

上面的sum()返回215个正确的结果,然后count()不返回实际结果它返回了表的总计数

tgabmvqs

tgabmvqs1#

count() 统计所有非空值,无论它们是什么。所以呢 0 也算在内。
这对我很有用 count() ```
COUNT(CASE WHEN g.branchid=30
THEN 1
ELSE NULL
END)

或者干脆离开房间 `else` 零件

COUNT(CASE WHEN g.branchid=30
THEN 1
END)

特别是在mysql中,您可以简化 `sum()` 就像那样(因为条件的结果是 `1` 或者 `0` )

SUM(g.branchid=30)

3zwjbxry

3zwjbxry2#

COUNT() 将计算它遇到的行数,因此即使您的 case ,它仍然是一行,因此将被计数。
如果你只是想知道 g.branchid=30 然后把它变成一个 WHERE 条款。。。

SELECT COUNT(*) AS count 
    FROM `liverates` l 
    LEFT JOIN branch b ON b.warehouseid=l.warehouseid 
    LEFT JOIN `group` g ON l.warehouseid=g.warehouseid
    WHERE g.branchid=30

这将忽略它不感兴趣的行,并可能使用索引。您还可以删除到分支表的链接,因为这看起来与本例无关。。。

SELECT COUNT(*) AS count 
    FROM `liverates` l 
    LEFT JOIN `group` g ON l.warehouseid=g.warehouseid
    WHERE g.branchid=30

相关问题