2016-10-22 48 views
0

我正在处理SQL Server 2012中的查询,但我被卡住了。基本上我需要从按国家和产品名称排序的一组行中获得排名前1的销售行。 3列由3个不同的表:SQL Server如何从一组行中获得最高销售排

SELECT  
    c.Country, p.ProductName AS [Product Name], 
    SUM(o.TotalPrice) AS [Sales Revenue] 
FROM  
    Orders o 
JOIN  
    Customers c ON o.CustomerID = c.CustomerID 
JOIN  
    Products p ON o.ProductID = p.ProductID 
GROUP BY 
    c.Country, p.ProductName 
ORDER BY 
    c.Country, SUM(o.TotalPrice) DESC 

我得到以下结果:

Customers, Product, Orders 

运行此查询后

Country  Product Name  Sales Revenue 
--------------------------------------------- 
Argentina Marmalade   2620.00 
Argentina Queso Cabrales 630.00  
Austria  Spegesild   432.00  
Belgium  Courdavault  4950.00 
Belgium  Ipoh Coffee  2557.60 
Belgium  Flotemysost  1505.00 
Belgium  Alice Mutton  1248.00 

我需要的结果显示完全一样以上表格格式:

Country  Product Name  Sales Revenue 
--------------------------------------------- 
Argentina Marmalade   2620.00 
Austria  Spegesild   432.00  
Belgium  Courdavault  4950.00 

试图在sum()上使用max,但它没有工作。也尝试了TOP 1,但无法弄清楚。请帮忙。谢谢!

回答

3

您可以使用公用表表达式(CTE)按国家和按SUM(o.TotalPrice)降序对数据进行分区。

WITH records 
AS 
(
    SELECT c.Country, 
     p.ProductName  AS [Product Name], 
     SUM(o.TotalPrice) AS [Sales Revenue], 
     ROW_NUMBER() OVER (PARTITION BY c.Country 
           ORDER BY SUM(o.TotalPrice) DESC) RN   
    FROM Orders o 
    JOIN Customers c ON o.CustomerID = c.CustomerID 
    JOIN Products p ON o.ProductID = p.ProductID 
GROUP BY c.Country, p.ProductName 
) 
SELECT Country, 
     [Product Name], 
     [Sales Revenue] 
    FROM records 
WHERE RN = 1 
+0

嗨ddrjca,这一个作品完美!谢谢 – Sunshine