2012-11-19 68 views
0

我使用SQL Server 2008的TSQL MAX

我有銷售訂單表的結構是這樣

PartNo Desc  OrderDate  OrderQty 
60001 widget1 Apr-02-2012 3 
60001 widget1 Apr-14-2012 5 
60001 widget1 Jun-04-2012 3 
60002 widget2 Jan-03-2012 1 
60002 widget2 jan-17-2012 1 
60002 widget2 aug-04-2012 30 
60002 widget2 sep-02-2012 1 
60003 widget3 oct-01-2012 4 
60003 widget3 oct-04-2012 7 
60003 widget3 oct-17-2012 3 
60004 widget4 nov-04-2011 8 
60004 widget4 nov-05-2011 8 
60004 widget4 nov-05-2012 8 
60004 widget4 nov-07-2012 7 

我想回到一個表,每月總的最大爲每個項目。它看起來像這樣

PartNo Desc  MaxSoldPerMonth Month Year 
60001  widget1 8    Apr 2012 
60002  widget2 30    Aug 2012 
60003  widget3 14    oct 2012 
60004  widget4 16    nov 2011 

月實際上是數字格式(即月= 11月= 10月= 4,ECT)我做到了這種方式,以方便閱讀。由於

回答

3

這應做到:

;WITH MonthlyOrders AS 
(
    SELECT PartNo, [Desc], CONVERT(VARCHAR(6),OrderDate,112) YearMonth, SUM(OrderQty) OrderQty 
    FROM YourTable 
    GROUP BY PartNo, [Desc], CONVERT(VARCHAR(6),OrderDate,112) 
),MaxOrders AS 
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY PartNo, [Desc] ORDER BY OrderQty DESC) RN 
    FROM MonthlyOrders 
) 
SELECT PartNo, [Desc], OrderQty MaxSoldPerMonth, YearMonth 
FROM MaxOrders 
WHERE RN = 1; 
+0

迅速!!!!!!!!!! – Taryn

+0

@bluefeet好吧,我很無聊;-) – Lamak

+0

這工作......謝謝!什麼是這些(分區)RN聲明調用,所以我可以看看他們? – decapo

3

您可以使用以下方法:

;with cte as 
(
    select partno, 
    [desc], 
    sum(orderqty) total, 
    datename(month, orderdate) month, 
    year(orderdate) year, 
    row_number() over(partition by partno order by sum(orderqty) desc) rn 
    from yourtable 
    group by partno, [desc], 
    datename(month, orderdate), year(orderdate) 
) 
select partno, [desc], total, month, year 
from cte 
where rn = 1 

SQL Fiddle with Demo

+0

+1不知道你可以在'row_number'的'order by'部分使用'sum'。 – Lamak

+0

@拉馬克直到我嘗試過,我才知道。 :)我實際上期待着一個錯誤,當它工作時感到驚訝。 – Taryn