【问题标题】:Need to retrieve top 3 vendors by total amount, per category - subcategory需要按总金额检索前 3 个供应商,每个类别 - 子类别
【发布时间】:2022-11-02 20:33:45
【问题描述】:

我有这个数据库表:http://sqlfiddle.com/#!9/e1dd38e/7

我正在尝试查询它,以便它遍历每个类别,返回每个子类别的前 3 名供应商,按他们的总支出(总和(金额))排序,前 3 名之外的供应商将被汇总为总数并被包括在内作为“其他人”

还包括类别和子类别的总额

我很感激任何帮助,在这方面苦苦挣扎

预期结果将是:

Paper 515.54
    Napkins 314.99
        Paper LLC 110.49
        Dunder Mifflin 70.99
        Brawny 60.02
        Others 73.49
    Towels 200.55
        Acme LLC 52.01
        Michigan Paper 41.23
        Cascades LLC 40.55
        Others 66.76
Food 205.54
    Apples 178.76
        Orchards LLC 97.10
        Northstar Orchard 41.23
        Apples LLC 40.43
    Pizza 26.78
        Dominos 16.53
        Pizza Hut 10.25

【问题讨论】:

    标签: mysql sql select aggregate sequel


    【解决方案1】:

    您可以在ROW_NUMBER() 函数的帮助下使用两个级别的聚合来定义其他供应商的唯一组,这些供应商的总和排名为 4 或更多,如下所示:

    SELECT category, subcategory, 
           CASE 
             WHEN grp <= 3 THEN MAX(vendor) 
             ELSE 'Others' 
           END AS vendor, 
           SUM(sum_amount) AS total_amount
    FROM
    (
      SELECT category, subcategory, vendor, SUM(amount) sum_amount,
           CASE 
             WHEN ROW_NUMBER() OVER (PARTITION BY category, subcategory ORDER BY SUM(amount) DESC) <=3
             THEN ROW_NUMBER() OVER (PARTITION BY category, subcategory ORDER BY SUM(amount) DESC)
             ELSE 4
           END AS grp
      FROM purchases
      GROUP BY category, subcategory, vendor
    ) T
    GROUP BY category, subcategory, grp
    ORDER BY category DESC, subcategory, grp 
    

    请参阅demo

    如果可能有多个供应商具有相同的前三个金额总和,并且您希望将它们全部列出(不仅仅是其中三个),则将 ROW_NUMBER() 函数替换为 DENSE_RANK() 函数,如下所示:

    SELECT category, subcategory, 
           grp AS vendor,
           SUM(sum_amount) AS total_amount
    FROM
    (
      SELECT category, subcategory, vendor, SUM(amount) sum_amount,
           CASE 
             WHEN dense_rank() OVER (PARTITION BY category, subcategory ORDER BY SUM(amount) DESC) <=3
             THEN vendor
             ELSE 'Others'
           END AS grp
      FROM purchases
      GROUP BY category, subcategory, vendor
    ) T
    GROUP BY category, subcategory, grp
    ORDER BY category DESC, subcategory, CASE WHEN grp<>'Others'THEN 1 ELSE 2 END, SUM(sum_amount) DESC 
    

    在修改后的数据集上查看demo

    【讨论】:

    • 谢谢你!欣赏不同功能的解释
    • 不客气,但我注意到使用 DENSE_RANK 存在问题,我正在努力,我会尽快更新答案。对于 ROW_NUMBER,我认为没问题,您可以检查并更新我。
    • 请检查使用DENSE_RANK 函数的更新答案。
    • 我会怎么做才能将“其他”更改为动态的,所以它会返回有多少其他供应商,例如:2 个其他供应商
    • 您可以在 case 表达式中使用 count 作为 dbfiddle.uk/lAsUpy10
    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    相关资源
    最近更新 更多