MySQL 具有特定值的 GROUP BY 并保持为 'other'

MySQL GROUP BY with specific values and remaining as 'other'

我在用户注册时有一个 how did you hear about us? 表单域。现在通过收集的数据,我试图找到每个选项的百分比。我遇到的问题是任何已填写 other 的用户,我无法使用 group by 方法,因为他们输入了不同的内容。我如何将选项中没有的任何内容分组为 other?

user  |  how_heard
user1 |  facebook
user2 |  youtube
user3 |  facebook
user4 |  instagram
user5 |  advert
user6 |  facebook
user7 |  browsing the internet
user8 |  promotional tag
user9 |  university recommended me

最后三个用户,应分组为 other。我该怎么做?

这是我的查询,它有效但不适用于 other 中键入的值。

SELECT ma.how_heard
     , COUNT(1) AS total
     , COUNT(1) / t.cnt * 100 AS `percentage`
  FROM users ma
 CROSS
  JOIN (SELECT COUNT(1) AS cnt FROM users) t
 GROUP
    BY ma.how_heard
     , t.cnt  

您可以使用 case 表达式:

SELECT 
    CASE WHEN u.how_heard IN ('facebook', 'youtube', 'instagram', 'advert')
        THEN u.how_heard
        ELSE 'other'
    END as how_heard_new,
    COUNT(*) AS total,
    COUNT(*) / t.cnt * 100 AS `percentage`
FROM users u 
CROSS JOIN (SELECT COUNT(*) AS cnt FROM users) t
GROUP BY how_heard_new, t.cnt  

注意,如果你是运行 MySQL 8.0,你可以用window sum:

替换子查询
SELECT 
    CASE WHEN u.how_heard IN ('facebook', 'youtube', 'instagram', 'advert')
        THEN u.how_heard
        ELSE 'other'
    END as how_heard_new,
    COUNT(*) AS total,
    COUNT(*) / SUM(COUNT(*)) OVER() * 100 AS `percentage`
FROM users u 
GROUP BY how_heard_new