首页 > 解决方案 > MySQL 返回总和值和一个虚拟列作为 (count - sum)

问题描述

我有一张如下表: log (log_id, log_success (bool), log_created)

我想 SELECT 并返回 3 列date successno_success,其中前者在表中不存在,最后按天聚合它们。

我创建了这个查询:

SELECT
log_created as 'date'
COUNT(*) AS 'count',
SUM(log_success) AS 'success'
SUM('count' - 'success') AS 'no_success'
FROM send_log
GROUP BY DATE_FORMAT(log_created, '%Y-%m-%d');

我能用这个查询来实现它吗?我的语法正确吗?

谢谢。

标签: mysql

解决方案


您不能在同一个 select 子句中重用 select 中定义的别名。原因是当你去访问它时它甚至可能没有被定义。但是,您可以很容易地重复逻辑:

SELECT
    log_created AS date,
    SUM(log_success) AS success,
    COUNT(*) - SUM(log_success) AS no_success,
FROM send_log
GROUP BY
    log_created;

我不知道您为什么要DATE_FORMAT在查询的group by子句中调用。 DATE_FORMAT通常是一个表示层函数,调用它是因为您想查看以某种方式格式化的日期。由于它看起来已经是一个日期,因此在聚合时log_created无需调用它。DATE_FORMAT您甚至不需要在 select 子句中,因为 MySQL 日期的默认格式已经是Y-m-d.


推荐阅读