【问题标题】:How to get a COUNT() value when GROUP BY has no row?当 GROUP BY 没有行时如何获取 COUNT() 值?
【发布时间】:2020-03-09 11:32:19
【问题描述】:

RDMS : MariaDB 10.1.23

MCRE:

create table entity
(
    id_entity int auto_increment,
    created_at timestamp default CURRENT_TIMESTAMP,
    constraint product_log_pk
        primary key (id_entity)
);

INSERT INTO entity SET created_at = CURRENT_TIMESTAMP;
INSERT INTO entity SET created_at = CURRENT_TIMESTAMP;
INSERT INTO entity SET created_at = CURRENT_TIMESTAMP;

-- I would like this to return 0
SELECT IF(COUNT(e.id_entity) = 0, 0, e.id_entity) 
FROM entity e
WHERE e.created_at < CURRENT_DATE - INTERVAL 1 DAY GROUP BY e.created_at;

SQLFiddle:http://sqlfiddle.com/#!9/f32a01/1


考虑以下查询:

SELECT IF(COUNT(e.some_field) = 0, 0, e.some_field) 
FROM entity e
WHERE e.created_at > CURRENT_DATE - INTERVAL 1 DAY GROUP BY e.created_at

如果没有 GROUP BY 子句,我知道如果没有行匹配查询,COUNT() 将返回 0

我也知道,如果我的 GROUP BY “失败”(如果我没有要分组的行,在我的示例中,如果没有行满足 e.created_at &gt; CURRENT_DATE - INTERVAL 1 DAY),那么 COUNT() 将不会返回任何内容(0 行) .在这种情况下,如何确保 COUNT() 返回 0(1 行的值为 0)?

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。

标签: mysql sql mariadb aggregate-functions


【解决方案1】:

在评估 where 子句之后进行分组;如果 where 子句消除了所有行,则没有可分组的内容。

我猜你想要条件聚合。这是一个例子:

name | dept | gender
-----+------+-------
jane | acc  | f
john | acc  | m
jack | hr   | m
jake | hr   | m

并查询按部门统计所有女性员工:

SELECT dept, COUNT(CASE WHEN gender = 'f' THEN 1 END)
FROM employee
-- WHERE gender = ... will/could eliminate entire group(s)
GROUP BY dept
dept | count
-----+------
acc  | 1
hr   | 0

【讨论】:

    【解决方案2】:

    “标准”方式是

     COALESCE(value, 0)
    

    通常这样使用:

    COALESCE( ( SELECT COUNT(*) ... ), 0)
    

    【讨论】:

      【解决方案3】:

      你似乎只关心一排。为此,只需删除 GROUP BY

      我不知道IF() 应该做什么

      SELECT COUNT(e.some_field)
      FROM entity e
      WHERE e.created_at > CURRENT_DATE - INTERVAL 1 DAY ;
      

      如果要返回值 i some_field,那么 GROUP_CONCAT() 会将它们全部放在一列中:

      SELECT GROUP_CONCAT(e.some_field)
      FROM entity e
      WHERE e.created_at > CURRENT_DATE - INTERVAL 1 DAY ;
      

      这两个总是返回一行,因为它们是没有GROUP BY 的聚合查询。如果没有匹配的行,第一个返回 0,第二个返回 NULL

      【讨论】:

      • 我的问题并不是关于“删除 GROUP BY 子句以始终获得一行” - 假设我需要 GROUP BY,(出于某种原因)。我如何处理我的GROUP BY 没有行的情况,我仍然想选择一些东西(比如说0)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多