2017-05-08 2 views
0

이 문제를 해결하는 가장 효율적인 방법을 찾고 있습니다.GROUP BY SQL을보다 효율적으로 해결 SQL Server AdventureWorks

AdventureWorks 데이터베이스를 사용하여 쿼리 SQL을 만들어야합니다. 대신 0이 MinUnitPrice 및 MaxUnitPrice의

An example of the results

declare @fecha datetime 
set @fecha = GETDATE()-1365 
declare @MPid int 
set @MPid = 50 

select OH.CustomerID, OH.SalesPersonID, 
'Month' = Month(OH.OrderDate), 
PP.Name, 
pp.MakeFlag, 
'CantProduct' = SUM(SOD.OrderQty), 
'MinUnitPrice' = 0 , 
'MaxUnitPrice' = 0 

from sales.SalesOrderHeader OH JOIN sales.SalesOrderDetail SOD ON OH.SalesOrderID = SOD.SalesOrderID 
JOIN Production.Product PP ON SOD.ProductID = PP.ProductID 
where OH.OrderDate > DATEADD(year,-1,@fecha) and pp.ProductID > @MPid 
group by OH.CustomerID, OH.SalesPersonID, Month(OH.OrderDate), PP.Name, pp.MakeFlag 

다음과 같이이 쿼리 SQL은 최대 및 최소 가격을 얻어야한다, 필드를 반환해야합니다. 임시 테이블을 사용하지 않고도 해결할 수 있습니까? 아니면 가장 효율적인 솔루션이 될 것입니까? 감사

+0

은 그냥'MAX'를 사용하는 솔루션과'MIN' 집계 함수, _exactly_ 당신은'SUM' 집계 함수 –

+0

감사 사용한으로하지만 그런 식의 최대 값과 최소값 항상 동일하고 필요한 것은 아닙니다. – Ever

+0

실제로 무엇을했는지에 대한 설명이 없습니다. _ 최대 및 최소 가격을 얻으십시오 ._ 최소 및 최대 무엇을? 영업 사원의 최대/최소 가격을 원하십니까? 또는 영업 사원/고객 조합? 원하는 것을 설명해주십시오. –

답변

0

declare @fecha datetime 
declare @MPid int 

set @fecha = GETDATE()-1365 
set @MPid = 50 


select ROW_NUMBER() OVER(ORDER BY OH.CustomerID ASC) AS ID, OH.CustomerID, OH.SalesPersonID, 'Month' = Month(OH.OrderDate),PP.Name, pp.MakeFlag, 'CantProduct' = SUM(SOD.OrderQty), 
'MinUnitPrice' = min(SOD3.MinUnitPrice) , 'MaxUnitPrice' = max(SOD5.MaxUnitPrice) 

from sales.SalesOrderHeader OH Join sales.SalesOrderDetail SOD ON OH.SalesOrderID = SOD.SalesOrderID 
    Join Production.Product PP ON SOD.ProductID = PP.ProductID 

    Join (select SOD2.ProductID, SOD2.SalesOrderID, 'MinUnitPrice' = Min(SOD2.UnitPrice) from sales.SalesOrderDetail SOD2 
      group by SOD2.ProductID ,SOD2.SalesOrderID) SOD3 ON SOD3.ProductID = SOD.ProductID and SOD3.SalesOrderID = SOD.SalesOrderID 

    Join (select SOD4.ProductID, SOD4.SalesOrderID, 'MaxUnitPrice' = Max(SOD4.UnitPrice) from sales.SalesOrderDetail SOD4 
      group by SOD4.ProductID ,SOD4.SalesOrderID) SOD5 ON SOD5.ProductID = SOD.ProductID and SOD5.SalesOrderID = SOD.SalesOrderID 

    where OH.OrderDate > DATEADD(year,-1,@fecha) and pp.ProductID > @MPid 

    group by OH.CustomerID, OH.SalesPersonID, Month(OH.OrderDate), PP.Name, pp.MakeFlag