2017-03-23 6 views
0

나는 모든 제품, 각 제품을 구입 한 모든 고객 및 수량을 찾을 수있는 질의가 있습니다.SQL And Northwind

select OD.ProductID, OD.Quantity, O.CustomerID 
from dbo.[Order Details] OD inner join dbo.Orders O on OD.OrderID = O.OrderID 
Order by OD.ProductID ASC, OD.Quantity DESC 

하지만 지금 내가 필요한 것은 고객이 각 제품의 대부분을 구입 한 것입니다. 내가 어떻게 해?

+0

SQL 서버의 버전은 무엇? 이후 버전에서는 RANK()를 사용하여이 작업을 수행 할 수 있습니다. –

+0

SQL Server 2014 –

답변

0

당신은 rank 창 기능을 top 1 with ties를 사용할 수 있습니다 해당 제품의 주문 최대 수량 여러 고객이있는 경우

select top 1 with ties OD.ProductID, 
    OD.Quantity, 
    O.CustomerID 
from dbo.[Order Details] OD 
inner join dbo.Orders O on OD.OrderID = O.OrderID 
order by rank() over (
     partition by OD.ProductID order by OD.Quantity desc 
     ); 

은 위의 productId에 당 여러 행을 반환합니다.

당신은 단지 하나 개의 행을 얻고 싶은 경우에, 당신은 row_number 사용할 수 있습니다

select top 1 with ties OD.ProductID, 
    OD.Quantity, 
    O.CustomerID 
from dbo.[Order Details] OD 
inner join dbo.Orders O on OD.OrderID = O.OrderID 
order by row_number() over (
     partition by OD.ProductID order by OD.Quantity desc 
     ); 

또한 top없이이 작업을 수행 할 수 있습니다

select * 
from (
    select OD.ProductID, 
     OD.Quantity, 
     O.CustomerID, 
     row_number() over (
      partition by OD.ProductID order by OD.Quantity desc 
      ) as rn 
    from dbo.[Order Details] OD 
    inner join dbo.Orders O on OD.OrderID = O.OrderID 
    ) t 
where rn = 1; 
+0

하위 쿼리로 수행 할 수있는 방법이 있습니까? 나는 결코 계급을 사용하지 않았거나 넥타이를 가지고있다. –

+0

@WaltherEmilioCarrasco - Window 함수는 이러한 종류의 문제를 해결한다. 'top'을 사용하고 싶지 않다면, 업데이트 된 대답의 세 번째 질의를보십시오. – GurV

+0

이 기회를 빌어 창 기능을 사용하는 법을 배워야합니다. –