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

SQL Server:获取每位客户的最高采购金额及对应产品

如何获取每位客户的最高采购金额及对应产品信息?

我编写了如下SQL查询语句:

select C.Persona, C.Producto, Sum(C.Cantidad * P.Precio) [Total_Purchase] 
from Compras C 
join Precios P on C.Producto = P.Item 
group by C.Producto, C.Persona

该语句可返回每位客户(Persona)对应各产品的总采购金额。请问如何调整该语句,以获取每位客户的最高采购金额及对应的产品信息?


针对你的需求,这里有两种实用的解决方案,优先推荐窗口函数法,因为它代码更简洁、执行效率也更高:

方法一:使用窗口函数 RANK()(保留并列最高记录)

窗口函数可以轻松给每个客户的产品采购额单独排序,然后筛选出排名第一的记录。如果某客户有多个产品的总采购金额并列最高,RANK()会把这些记录都保留下来,这很符合实际业务场景。

WITH CustomerProductTotals AS (
    -- 先复用你原来的查询,算出每个客户每个产品的总采购额
    SELECT 
        C.Persona, 
        C.Producto, 
        SUM(C.Cantidad * P.Precio) AS Total_Purchase
    FROM Compras C 
    JOIN Precios P ON C.Producto = P.Item 
    GROUP BY C.Producto, C.Persona
),
RankedTotals AS (
    -- 给每个客户的采购记录按总金额降序排名
    SELECT 
        Persona,
        Producto,
        Total_Purchase,
        RANK() OVER (PARTITION BY Persona ORDER BY Total_Purchase DESC) AS PurchaseRank
    FROM CustomerProductTotals
)
-- 筛选出每个客户排名第一的记录
SELECT Persona, Producto, Total_Purchase
FROM RankedTotals
WHERE PurchaseRank = 1;

如果你的需求是只保留任意一个最高金额的产品(即使有并列),可以把RANK()换成ROW_NUMBER(),它会给每条记录分配唯一的排名。

方法二:子查询关联法(兼容旧版本数据库)

如果你的数据库不支持窗口函数(比如一些老版本的MySQL、SQL Server),可以用子查询先找出每个客户的最高总金额,再关联回原统计结果,匹配出对应的产品信息:

WITH CustomerMaxTotal AS (
    -- 第一步:算出每个客户的最高采购金额
    SELECT 
        Persona,
        MAX(Total_Purchase) AS Max_Total
    FROM (
        SELECT 
            C.Persona, 
            SUM(C.Cantidad * P.Precio) AS Total_Purchase
        FROM Compras C 
        JOIN Precios P ON C.Producto = P.Item 
        GROUP BY C.Producto, C.Persona
    ) AS CustomerTotals
    GROUP BY Persona
)
-- 第二步:关联回去找到对应产品和金额
SELECT 
    CT.Persona,
    CT.Producto,
    CT.Total_Purchase
FROM (
    SELECT 
        C.Persona, 
        C.Producto, 
        SUM(C.Cantidad * P.Precio) AS Total_Purchase
    FROM Compras C 
    JOIN Precios P ON C.Producto = P.Item 
    GROUP BY C.Producto, C.Persona
) AS CT
JOIN CustomerMaxTotal CM ON CT.Persona = CM.Persona AND CT.Total_Purchase = CM.Max_Total;

这个方法同样会保留并列最高的记录,逻辑和窗口函数一致,只是写法更繁琐一些。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:06:50