2

データベースにクエリを実行して、システム内のすべての顧客の最高収益月を見つけようとしています。データが存在するすべての年から顧客の月間収益を引き出すクエリが機能しています。しかし、このデータから毎月最高の収益を得る方法を見つけるのに苦労しています。

データベースは 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

したがって、収益の観点から、すべての顧客の最高の月とそれぞれの年です。

4

1 に答える 1

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 By Year Order By Revenue DESC を = ROW_NUMBER() OVER(PARTITION By Customer Order By Revenue DESC に変更

于 2013-10-11T00:53:45.590 に答える