首页 > 解决方案 > 在不引用别名但使用 SUM(CASE) 的情况下过滤 MySQL 输出

问题描述

为了修复我们的数据库中丢失的用户 ID,我正在尝试查看在同一个表中找到有和没有 ID 的同一个用户的实例。到目前为止,我使用以下方法得到了粗略的结果:

SELECT users,
        SUM(CASE WHEN UserID = ""  THEN 1 ELSE 0 END) as InstancesWithoutIDs,
        SUM(CASE WHEN UserID <> "" THEN 1 ELSE 0 END) as InstancesWithIDs,
    COUNT(*) as TOTAL
    FROM table.users
GROUP BY name;

我现在想要一个where InstancesWithIDs > 0应用于表格的过滤器。但是当我继续阅读时,我无法在过滤器中引用别名。通过谷歌搜索,我认为我得到的最好的是:

SELECT * from (
    SELECT users,
            SUM(CASE WHEN UserID = ""  THEN 1 ELSE 0 END) as InstancesWithoutIDs,
            SUM(CASE WHEN UserID <> "" THEN 1 ELSE 0 END) as InstancesWithIDs,
        COUNT(*) as TOTAL
        FROM table.users) A
where InstancesWithIDs > 0;

但这会将所有结果显示为一条记录。

users    ||   InstancesWithoutIDs   || InstancesWithIDs 
A. Fisher            62588                  947711

我怎样才能显示完整的表格,就像我对顶部查询所做的那样?

非常感谢任何帮助!

标签: mysql

解决方案


您可以像这样使用拥有(仅当您使用 GROUP BY 时):

SELECT users,
        SUM(CASE WHEN UserID = ""  THEN 1 ELSE 0 END) as InstancesWithoutIDs,
        SUM(CASE WHEN UserID <> "" THEN 1 ELSE 0 END) as InstancesWithIDs,
    COUNT(*) as TOTAL
    FROM table.users
GROUP BY name
HAVING InstancesWithIDs > 0;

HAVING 将等同于 WHERE 但对于聚合函数


推荐阅读