SQL Server 2017:如何获取产品对应最大客户及销量总和?
用SQL Server 2017 OLAP函数实现按产品类别取销量最高客户的方案
当然可以用OLAP窗口函数完美解决这个需求!SQL Server 2017支持的窗口函数刚好适配这类「分组取Top 1」的场景,下面我给你一步步拆解实现逻辑:
实现思路
- 先按产品类别+客户分组,计算每个客户在对应类别下的总销量;
- 用窗口函数给每个产品类别内的客户按总销量降序排名;
- 筛选出每个类别中排名第一的记录,就是我们要的结果。
具体SQL代码
假设你的表名为SalesData,完整查询语句如下:
-- 第一步:计算每个客户在每个产品类别下的总销量 WITH CategoryClientSales AS ( SELECT Product_Category, Client_Name, SUM(Units_Sold) AS Total_Units FROM SalesData GROUP BY Product_Category, Client_Name ) -- 第二步:给每个类别内的客户按销量排名,取Top 1 SELECT Product_Category, Client_Name, Total_Units FROM ( SELECT *, -- 按产品类别分区,总销量降序排名 ROW_NUMBER() OVER (PARTITION BY Product_Category ORDER BY Total_Units DESC) AS Sales_Rank FROM CategoryClientSales ) RankedSales WHERE Sales_Rank = 1 ORDER BY Product_Category;
关键细节说明
- 窗口函数选择:这里用了
ROW_NUMBER(),它会给每个类别内的客户分配唯一排名,即使有客户销量相同,也会随机(取决于底层数据顺序)选一个。如果需要返回所有并列第一的客户,可以把ROW_NUMBER()换成:RANK():并列客户共享相同排名,后续排名会跳过(比如1,1,3)DENSE_RANK():并列客户共享相同排名,后续排名连续(比如1,1,2)
- 数据验证:用你提供的示例数据代入查询,得到的结果完全符合预期:
Product1,Client2,27
Product2,Client1,53
Product3,Client1,36
内容的提问来源于stack exchange,提问作者Nullius Void
相关产品推荐
相关产品推荐

