【问题标题】:Select by fixed categories top result and rest in others按固定类别选择最高结果,其余为其他
【发布时间】:2020-08-26 09:20:28
【问题描述】:

乞求我要说我不能改变数据库的任何结构,只允许选择。 我考虑了大约 1 周,但找不到解决问题的方法。

假设我有这样的表:https://www.db-fiddle.com/f/cEbW3ZoQBRpun3Pt5g3h3v/1 那里我有产品及其类别,我会制作报告,显示 X 类别中有多少产品,并选择 TOP 3 计数,其他显示在“其他”中,所有其他计数。但是某些类别应该一起计算(我想在选择查询中预定义它们),例如我将 A 计数与 G 和 B-C、E-F。

所以结果应该是这样的:

B-C = 7
A-G = 6
D = 5
OTHERS = 6

告诉我,它甚至可以只选择,如果是,请告诉我如何(示例会很好)如果不是,我会告诉我的经理,因为 RN 他不会相信我说“你可以做到” ”。

【问题讨论】:

  • 我想你的意思是“去”
  • 您可以多次left join 与自己的表并在join clause 中为每种类型的类别定义条件。

标签: mysql sql database group-by count


【解决方案1】:

我会用一个代表类别之间映射的派生表来处理这个问题,原始表可以是left joined。然后,您可以聚合,从而为您提供每个“真实”类别的产品数量。然后,您可以使用窗口函数(仅在 MySQL 8.0 中可用)和额外的聚合级别将前 3 个类别与其余“真实”类别分开。

select 
    case when rn <= 3 then real_category else 'Other' end final_category,
    sum(no_products) no_products
from (
    select 
        coalesce(x.new_category, p.category) real_category, 
        count(*) no_products,
        rank() over(order by count(*) desc) rn
    from products p
    left join (
        select 'A' category, 'A-G' new_category
        union all select 'G', 'A-G'
        union all select 'B', 'B-C'
        union all select 'C', 'B-C'
        union all select 'E', 'E-F'
        union all select 'F', 'E-F'
    ) x on x.category = p.category
    group by real_category
) t
group by final_category
order by no_products desc

Demo on DB Fiddle

final_category | no_products :------------- | ----------: A-G | 6 BC | 6 D | 5 其他 | 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 2020-03-22
    • 2014-09-15
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多