You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询每张发票对应关联订单数最多的买家

问题原因

你现有SQL的逻辑完全没有实现筛选逻辑:内层子查询已经按invoice_N(发票编号)、buyer(买家)分组,计算出了每张发票下每个买家对应的关联订单数,外层再次按同样的两个字段分组取最大值,等价于直接返回内层的全部计算结果,不会筛选出每张发票对应的订单数最多的买家。


解决方案

方案1:窗口函数版本(适配MySQL 8.0+、PostgreSQL、SQL Server等所有支持窗口函数的主流数据库,推荐使用)

SELECT invoice_N, buyer, count_order
FROM (
    SELECT
        invoice_N,
        buyer,
        COUNT(DISTINCT OrderIdent) AS count_order,
        -- 按发票编号分组,组内按关联订单数倒序排名
        RANK() OVER(PARTITION BY invoice_N ORDER BY COUNT(DISTINCT OrderIdent) DESC) AS rk
    FROM invoices
    LEFT JOIN orders ON -- 此处补全你原本的表关联条件
    GROUP BY invoice_N, buyer
) t
WHERE rk = 1;

如果同一张发票下存在多个买家并列订单数最多的情况,上述语句会返回所有并列第一的买家;如果仅需要取任意一个最高订单数的买家,把RANK()替换为ROW_NUMBER()即可。

方案2:兼容老版本无窗口函数的数据库(如MySQL 5.x)

SELECT a.invoice_N, a.buyer, a.count_order
FROM (
    SELECT
        invoice_N,
        buyer,
        COUNT(DISTINCT OrderIdent) AS count_order
    FROM invoices
    LEFT JOIN orders ON -- 此处补全你原本的表关联条件
    GROUP BY invoice_N, buyer
) a
INNER JOIN (
    -- 先计算每张发票对应的最高关联订单数
    SELECT invoice_N, MAX(count_order) AS max_order_count
    FROM (
        SELECT
            invoice_N,
            COUNT(DISTINCT OrderIdent) AS count_order
        FROM invoices
        LEFT JOIN orders ON -- 此处补全你原本的表关联条件
        GROUP BY invoice_N, buyer
    ) t
    GROUP BY invoice_N
) b ON a.invoice_N = b.invoice_N AND a.count_order = b.max_order_count;

内容的提问来源于stack exchange,提问作者CCC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:48:05