代码之家  ›  专栏  ›  技术社区  ›  gustyaquino

同一SQL语句中的多个条件计数[重复]

  •  0
  • gustyaquino  · 技术社区  · 8 年前

    目标是根据每个任务的状态获取任务列表的进度,排除无效任务。

    目前,我成功地做到了这一点,但代价非常高昂,我想知道是否有可能在一个SQL语句中实现相同的结果,或者至少找到一种更优化的方法。

    SELECT COUNT(`id`) AS `status` FROM `task` WHERE `status` = 'done'
    UNION
    SELECT COUNT(`id`) AS `status` FROM `task` WHERE `status` = 'pending';
    

    上面的查询结果是2行,我可以把它们加起来,得到5的总和,这是正确的,第一行是已完成任务的计数:从那里很容易得到3/5或 60%完成

    status
    ------
    3
    2
    

    我知道这个例子很具体,我试过这个查询,但是遇到了一些问题。是关于分组的吗?或者我完全错了?

    SELECT
    COUNT(CASE WHEN `status` = 'done' THEN 1 ELSE 0 END) AS `done`,
    COUNT(CASE WHEN `status` = 'pending' THEN 1 ELSE 0 END) AS `pending`
    FROM `task`
    GROUP BY `status`;
    

    上面的查询分为2列和3个重复行:

    done    pending
    ---------------
    3       3
    1       1
    2       2
    

    在这个示例表中,我看到5个有效任务中有3个或60%已完成。

    name        status
    ------------------
    task 1      done
    task 2      done
    task 3      pending
    task 4      done
    task 5      invalid
    task 6      pending
    

    谢谢你的帮助!

    1 回复  |  直到 8 年前
        1
  •  1
  •   Vamsi Prabhala    8 年前

    你也在计算错误的情况 else 0 . 消除它将默认为 null 作为比较 false 也不会被计算在内。

    SELECT
    COUNT(CASE WHEN `status` = 'done' THEN 1 END) AS `done`,
    COUNT(CASE WHEN `status` = 'pending' THEN 1 END) AS `pending`
    FROM `task`
    WHERE `status` in ('done','pending')
    

    或者可以简化为

    SELECT
    SUM(`status` = 'done') AS `done`,
    SUM(`status` = 'pending') AS `pending`
    FROM `task`
    WHERE `status` in ('done','pending')