2012-03-08 57 views
2

我想回顧一下我的sql技巧,現在我試圖在northwinddb上運行一個簡單的查詢來向我展示每年的頂級客戶,但只要我只使用TOP函數1個記錄得到顯示在我的分區由無事,這是我的T-SQL代碼每年的SELECT TOP記錄

SELECT DISTINCT TOP 1 C.CompanyName 
, YEAR(O.OrderDate) AS Year 
, SUM(Quantity) OVER(PARTITION BY C.CompanyName, YEAR(O.OrderDate)) AS Total 
FROM Customers C JOIN Orders O 
    ON C.CustomerID = O.CustomerID JOIN [Order Details] OD 
    ON O.OrderID = OD.OrderID 

回答

12

您可以在SQL Server 2008中更爲緊湊做到這一點位如下:

select top (1) with ties 
    C.CompanyName, 
    Year(O.OrderDate) as Yr, 
    sum(OD.Quantity) as Total 
from Orders as O 
join Customers as C on C.CustomerID = O.CustomerID 
join "Order Details" as OD on OD.OrderID = O.OrderID 
group by C.CompanyName, Year(O.OrderDate) 
order by 
    row_number() over (
    partition by Year(O.OrderDate) 
    order by sum(OD.Quantity) desc 
); 
+0

'ORDER BY'中'ROW_NUMBER()'的使用非常有趣! – 2012-03-08 23:13:12

+0

當我終於明白這一點時,我咯咯笑了起來。出色的聰明:-) – 2012-03-12 00:22:26

+0

這是一個真正的魔術 – Arthur 2014-12-11 22:07:50

0

三個步驟:第一和數量由公司和年份分組,然後命令由量的結果,然後通過過濾第一行只有團隊。

; WITH sums as (
    SELECT C.Companyname, YEAR(O.OrderDate) AS Year, sum (Quantity) Total 
    FROM Customers C JOIN Orders O 
    ON C.CustomerID = O.CustomerID JOIN [Order Details] OD 
    ON O.OrderID = OD.OrderID 
    group by C.Companyname, YEAR(O.OrderDate) 
) 
with ordering as (
    select Companyname, Year, Total, 
      row_number() over (partition by CompanyName, Year order by Total desc) rownum 
     from sums 
) 
select * 
from ordering 
where rownum = 1 
1

謝謝你的幫助。我找到了一種方法,可以讓我改變每年想看的頂級客戶數量。通過使用子查詢和Row_Number

SELECT CompanyName 
,yr 
,Total 
FROM(SELECT CompanyName 
, yr 
, Total 
, ROW_NUMBER() OVER(PARTITION BY yr ORDER BY yr, Total DESC) AS RowNumber 
FROM(SELECT DISTINCT CompanyName 
    , YEAR(O.OrderDate) AS yr 
    , SUM(OD.Quantity) OVER(PARTITION BY CompanyName 
          , YEAR(O.OrderDate)) As Total 
    FROM Customers C JOIN Orders O 
     ON C.CustomerID = O.CustomerID JOIN [Order Details] OD 
     ON O.OrderID = OD.OrderID) Tr)Tr2 
Where RowNumber <= 1