2017-05-08 4 views
0

Ich suche die effizienteste Möglichkeit, dies zu lösen.Resolve GROUP BY SQL effizienter SQL Server AdventureWorks

Ich muss eine Abfrage SQL mit AdventureWorks-Datenbank erstellen. Diese Abfrage SQL müssen die Felder zurückkehren Wie unten

gezeigt
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 

An example of the results

Statt MinUnitPrice und MaxUnitPrice gleich 0 ist, sollte die maximale und minimale Preise erhalten. Kann es gelöst werden, ohne temporäre Tabellen zu verwenden? Oder welche wäre die effizienteste Lösung? Dank

+0

einfach die 'MAX' verwenden und' MIN' Aggregatfunktionen, _exactly_ wie Sie die 'SUM' Aggregatfunktion –

+0

Dank verwendet haben, aber auf diese Weise die Maximal- und Minimalwerte sind immer die gleichen und nicht die, die benötigt werden – Ever

+0

Es gibt keine Erklärung dessen, was Sie eigentlich wollen. _erhalten die Höchst- und Mindestpreise._ min und max von was? Wollen Sie die Höchst-/Mindestpreise für einen Verkäufer? oder eine Verkäufer/Kunden-Kombination? Bitte erklären Sie, was Sie wollen. –

Antwort

0

Die Lösung

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