2011-11-23 45 views
4

我擁有一些數據 - 針對不同公司的不同年份的銷售數據。 因此,我有該公司(當年)的公司ID,YearSales用於查找特定類型數據集的列的前n個值的SQL查詢

我想要的是獲得銷售額的TOP n價值和相應的公司IDYear,爲每個有數據的公司。

在SO中還有其他疑問,但它們是用於單個列的直接前向TOP n值(沒有像這裏所要求的條件)。

任何幫助,將不勝感激......

+0

什麼版本的sql server? –

回答

5

你可能需要的東西是這樣的:

select 
    CompanyName, 
    Year, 
    Sales 

from (
    select *, 
    row_number() over (partition by CompanyName order by Sales desc) as RowNbr 

    from data) src 

where RowNbr <= 5 

order by CompanyName, Sales desc 

只需用任何你喜歡的號碼更換5。

3

如果你是SQL 2005+,該CTE方法將工作:

WITH salesWithRank AS 
(
    SELECT CompanyID, Year, Sales 
     , RANK() OVER (PARTITION BY CompanyId ORDER BY Sales DESC) AS RowNumber 
    FROM SalesData 
) 
SELECT CompanyID, Year, Sales 
FROM salesWithRank AS s 
WHERE RowNumber <= 10 -- Top 10 sales for each CompanyId, any year 
ORDER BY CompanyId ASC, Sales DESC 

請注意,如果您在表中有公司名稱,你可以使用,也在訂購。

0

只是要直截了當:

SELECT TOP 3 CompanyID, Year, Sales 
FROM (SELECT CompanyID, Year, Sales, 
      ROW_NUMBER() OVER(ORDER BY CompanyID ASC,Sales DESC) AS RowNumber 
     FROM TargetTbl) AS TempTable 
ORDER BY RowNumber ASC 

編輯:有n的所需值(行上面的數字)代替3。

+0

-1。這將不會檢索所有公司的最後X年,它將檢索所有公司中最高的X銷售年度。一些公司可能被複制,有些可能被排除在外。 –

+0

你好@AdamRobinson,如何「SELECT CompanyID,Year,Sales,ROW_NUMBER()OVER(ORDER BY CompanyID ASC,Sales DESC)AS RowNumber FROM TargetTbl」排除了一些行,儘管這可能包含一些重複的數據,但它不是題。 提問者詢問前N個數據無條件,「銷售額的前n個值」是問題的一部分,這意味着他希望銷售DESC的訂單。請您再次審查,感謝您的時間。 –

+0

OP希望每個公司的N個銷售年份*。無論公司(即公司A可能擁有全部5個插槽),您的SQL將獲得前N個銷售年限。您的查詢在功能上等同於'選擇前N個CompanyID,年,來自TargetID的銷售,通過CompanyID銷售,銷售desc'。 –

相關問題