【问题标题】:Return zero in a count query with GROUP BY使用 GROUP BY 在计数查询中返回零
【发布时间】:2017-08-04 14:15:29
【问题描述】:

在我的维修表中,我想计算每种状态(1、2、3 和 4)的汽车:

Status 1: 5
Status 2: 0
Status 3: 6
Status 4: 3

如图所示,状态 2 上没有汽车,因此,我使用“WHEN status == 'n' 对每个状态进行计数,并且工作正常。”

现在我只想在一个查询中执行,但在我的查询中:

select status,count(car_id) from repairs GROUP BY status。

给我看这个:

Status 1: 5
Status 3: 6
Status 4: 3

【问题讨论】:

  • statusrepairs 是否存储在不同的表中?
  • @DarshanMehta 我只有一个表,repairs,其中包含 car_id 和一个包含整数 1-2-3 或 4 的状态行。
  • 你确定你的表中有状态 2。
  • 没有关于状态 == 2 的汽车的记录,所以它返回一个空结果而不是“0”@FahadAnjum
  • 这意味着它正在显示状态2:null。

标签: php mysql count group-by null


【解决方案1】:

您将需要一个来源,可能是一个表格,其中包含您希望在报告中显示的每个状态。一种方法是“日历表”方法,您可以将包含每个状态的表加入到当前查询中,例如

SELECT
    t1.status,
    COALESCE(t2.car_cnt, 0) AS car_cnt
FROM
(
    SELECT 1 AS status UNION ALL   -- replace this ad-hoc subquery with
    SELECT 2 UNION ALL             -- an actual "calendar" table of statuses
    SELECT 3 UNION ALL             -- or if you already have such a table, use that
    SELECT 4
) t1
LEFT JOIN
(
    SELECT status, COUNT(car_id) AS car_cnt
    FROM repairs
    GROUP BY car_id
) t2
    ON t1.status = t2.status

【讨论】:

  • 鉴于该问题也被标记为“PHP”,我认为这是一个不太合适的解决方案
  • @Strawberry 我不同意你的看法。没有必要的数据来回答业务查询与应用程序语言几乎没有关系。除非您建议从 PHP 处理此问题,否则我认为这是个坏主意。
【解决方案2】:

试试这个:

SELECT status, count(car_id) 
FROM repairs GROUP BY car_id 
UNION 
SELECT status, 0
FROM repairs WHERE status NOT IN 
(SELECT status FROM repairs GROUP BY car_id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多