将表按 2 列分组并优先考虑非空值?

时间:2021-05-08 07:08:45

标签: mysql sql select group-by

我只能访问数据库,无法更改结果的存储方式。

我有一张这样的桌子

UserID, Gender, Category

'f2', NULL,  '2'
'f2', 'female',  '2'
'05', 'male',  '2'
'06', 'female',  '2'
'ee', 'female',  '2'
'bd', NULL,  '2'
'dd', NULL,  '2'
'01', NULL,  '2'

这是我现在使用的查询

SELECT 
    gender,
    count(*) count
FROM
    user_history
WHERE
    1
    AND GROUP BY UserID, Gender,Category

这给了我错误的结果,因为它在没有优先考虑性别列的情况下进行合并(删除了性别的 f2)

我怎样才能得到与此类似的结果?预期输出:

性别计数

female  3     (f2,06,ee)
male    1     (only 05 is there)
unknown 3     (f2 has duplicate entries and one of the row has a gender, so I've to give priority to that)

1 个答案:

答案 0 :(得分:1)

您可以通过 2 个级别的聚合来实现:

SELECT COALESCE(Gender, 'Unknown') Gender, 
       COUNT(*) counter
FROM (
  SELECT UserID, MAX(Gender) Gender
  FROM user_history
  GROUP BY UserID
) t
GROUP BY Gender

或者如果您还想按 Category 分组:

SELECT COALESCE(Gender, 'Unknown') Gender, 
       COUNT(*) counter,
       Category
FROM (
  SELECT UserID, MAX(Gender) Gender, Category
  FROM user_history
  GROUP BY UserID, Category
) t
GROUP BY Gender, Category

参见demo