2013-10-11 2 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  5  2012 200 
XYZ  7  2012 800 
그대로 내가 원하는 무엇

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 

그래서 모든 고객의 가장 좋은 달 및 respe 수익면에서 1 년입니다. 수익 DESC으로 고객 주문

+0

(선택 같이 최대 "최대"뭔가를 사용해보십시오 수익) 테이블 – 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 

또는 에 연도 주문 수익 DESC으로 변화 = ROW_NUMBER() OVER (PARTITION은 = ROW_NUMBER() OVER (PARTITION

+0

에서 완벽하게 작동합니다. 거기에 중첩 쿼리의 마지막 수준을 추가하지 못했습니다. 여기에서해야 할 유일한 변경 사항은 BS 내부 SQL에 의한 그룹에 수익을 추가하는 것입니다. 그렇지 않으면 우리는 Row_Number()의 파티션에서 사용하십시오. 내가 추가 한 유일한 추가 기능이며 지금은 완벽하게 작동하고 있습니다 .tx – user2574121

+0

여전히 좋은 답변입니다. :) – Chef1075

관련 문제