MySQL - 如何对前 6 名和其余的总和进行分组

标签 mysql

我有一个报告表,每天汇总每个产品数量的数据。

    SELECT r.year, r.month, c.id, c.client_name, p.product_name, cc.country_name, sum(r.quantity) units FROM
    client c
    join report r on c.id = r.client_id
    join product p on r.product_id = p.id
    join country cc on r.country_id = c.id
    WHERE r.year = year(now())
    group by r.year, r.month, c.id, p.product_name, cc.country_name

我试图弄清楚组单位如何按月、客户、产品和国家/地区求和,其中查询显示前 5 个国家/地区的总和,其余是底部国家/地区的总和。像这样:

    case
    when sum(r.quantity) = 'Top 1' then cc.country_name
    when sum(r.quantity) =  Top 2' then cc.country_name
    .....
    when sum(r.quantity) = 'Top 2' then cc.country_name
    else 'Other'

我该怎么做?

提前致谢

最佳答案

你可以试试这个。在这里,我将结果从最多到更少排序并添加行号。所以前 6 个是顶部。

请尝试一下,但我无法测试。

SELECT
    @nr := ( @nr +1) AS nr,
    IF ( @nr < 7, CONCAT('Top ',@nr), 'other' ) AS top, 
    r.* FROM (
    SELECT r.year, r.month, c.id, c.client_name, p.product_name, cc.country_name, sum(r.quantity) units 
    FROM CLIENT c
    JOIN report r ON c.id = r.client_id
    JOIN product p ON r.product_id = p.id
    JOIN country cc ON r.country_id = c.id
    WHERE r.year = YEAR(now())
    GROUP BY r.year, r.month, c.id, p.product_name, cc.country_name
    ORDER BY sum(r.quantity) DESC
) AS r
CROSS JOIN ( SELECT @nr:=0 ) AS params;

关于MySQL - 如何对前 6 名和其余的总和进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37881268/

相关文章:

mysql - 未显示的数据存在于当前表中但不存在于另一个表中

mysql - 几个名字的列表,用相同的信息更新他们在表中的行

php - Wordpress 数据库 insert() 和 update() - 使用 NULL 值

mysql - MyISAM 和 InnobDB 引擎使用什么类型的索引?

php - 如何迭代 mysql 数组并从 PHP 数组追加相应的文本

mysql - 在 Solr(或其他分面搜索引擎)中搜索/导航,正确的方法是什么?

php - 为数据库表自动生成 CRUD UI 的应用程序

php - 当用户编辑他们的个人资料时,如何避免图像被覆盖为空白?

php - 搜索用户详细信息表

php - 如何从数据库中打印连续值?