2013-10-11 140 views
1

我正在查詢數據庫以查找系統中所有客戶的最高收入月份。我已經收到了這個查詢,旨在爲客戶提供來自所有數據所在年份的月收入。但我正在努力弄清楚如何從這些數據中獲得最高的每月收入。SQL查詢:爲客戶查找最高收入月/年

數據庫是SQL Server 2008 R2。 這些列是:客戶名稱,年,月和收入。 我甚至嘗試使用Row_Number()並嘗試按客戶名稱/年進行分區並按收入排序。但它沒有奏效。也許我在那裏犯了一些錯誤。

下面是我試圖構建基本查詢的方法。

Select Customer, Year(orderdatetime) as Year, Month(orderdatetime) as Month, SUM(Revenue) 
From Orders 
Group By Customer, Year(orderdatetime), Month(orderdatetime) 

這是我試圖用ROW_NUMBER()

WITH Max_Revenue AS 
(
Select Customer, Year(orderdatetime) as Year, Month(orderdatetime) as Month, SUM(Revenue), RowNumber = ROW_NUMBER() OVER(PARTITION By Year Order By Revenue DESC) 
    From Orders 
    Group By Customer, Year(orderdatetime), Month(orderdatetime) 
) 
Select Max_Revenue.Customer, Max_Revenue.Year, Max_Revenue.Month, Max_Revenue.Revenue 
From Max_Revenue 
Where Max_Revenue.RowNumber = 1 
Order By Max_Revenue.Customer asc 

的數據我得到的回覆是這樣的:

Customer Month Year Revenue 
    ABC  2  2012 100 
    ABC  3  2013 150 
    ABC  5  2012 200 
    XYZ  4  2011 500 
    XYZ  6  2012 650 
    XYZ  7  2012 800 

我想要什麼作爲輸出

Customer Month Year Revenue 
ABC  5  2012 200 
XYZ  7  2012 800 

因此,每個客戶的最佳月份和尊重就收入而言。

+0

嘗試使用 「最大」 像選擇MAX(收入)表 – zxc

回答

1
SELECT Customer, 
     Year, 
     Revenue, 
     Month 
FROM (
     SELECT Customer, 
       Year, 
       ROW_NUMBER() OVER(PARTITION By Customer Order By Revenue DESC) as rank, 
       Revenue, 
       Month 

     FROM (
       Select Customer, 
        Year(orderdatetime) as Year, 
        Month(orderdatetime) as Month, 
        SUM(Revenue) as Revenue 
       From Orders 
       Group By 
        Customer, 
        Year(orderdatetime), 
        Month(orderdatetime) 
      ) BS 

    GROUP BY Customer, 
      Year, 
      Month) BS2  
WHERE BS2.rank = 1 

或更改= ROW_NUMBER()OVER(PARTITION按年順序按收入DESC到 = ROW_NUMBER()OVER(PARTITION通過客戶訂單按收入DESC

+0

這很好,我錯過了在那裏添加最後一層的嵌套查詢。我們在這裏需要做的唯一修改是在BS內部SQL中添加收益,否則我們將無法在Row_Number()的分區中使用它。這是我添加的唯一額外的東西,它現在工作完美..tx – user2574121

+0

好的答案仍然。謝謝:) – Chef1075