【问题标题】:Group a Table by 2 columns and give priority to not null value?按 2 列对表进行分组并优先考虑非空值?
【发布时间】:2021-07-30 08:29:15
【问题描述】:

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

我们有一张这样的桌子

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)

【问题讨论】:

  • 你需要统计性别吗?
  • 是的,我也需要空性别(未知)的计数
  • 您当前和预期的输出是什么?你能描述清楚吗?
  • '我怎样才能得到类似的结果?'在该行下方,我添加了预期的输出

标签: mysql sql select group-by


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2021-12-08
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多