按固定类别选择排名靠前的结果,其余则按其他

问题描述 投票:0回答:1

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

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

因此结果应类似于:

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

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

mysql sql database group-by count
1个回答
0
投票

我将使用派生表来处理此问题,该派生表表示类别之间的映射,原始表可以通过left join处理。然后,您可以进行汇总,从而为这些“真实”类别的每个类别提供产品数量。然后,您可以使用窗口函数(仅在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 |没有产品:------------- | ----------:A-G | 6B-C | 6D | 5其他| 5
© www.soinside.com 2019 - 2024. All rights reserved.