首页 > 解决方案 > MySQL GROUP BY 具有特定值并保留为“其他”

问题描述

用户注册时我有一个how did you hear about us?表单字段。现在通过收集的数据,我试图找到每个选项的百分比。我遇到的问题是任何已填写的用户other,我不能按方法使用分组,因为他们输入了不同的内容。我如何按选项中没有的任何内容分组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  

标签: mysqlsqlcountcaseaggregate-functions

解决方案


您可以使用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,则可以将子查询替换为窗口总和:

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

推荐阅读