2012-06-15 69 views
2

我想使用排名前5的多個條件來排名前5位。MS Access Top 5查詢按月份和地區分組的多個條件

數據風格是年月日,區域1,subarea1,子areas2等等等等,類型,每行的唯一標識符。

我試圖做的是每月和地區找到頂級的5種類型。

樣本數據:


Date    Division  Sub Division  ID 
31/05/2012  Sales        001 
31/05/2012  Sales   Call Centre  002 
31/05/2012  Sales   Call Centre  003 
31/05/2012  Sales   Store    004 
31/05/2012  Marketing       005 
31/05/2012  Marketing  TV    006 
30/04/2012  Sales        001 
30/04/2012  Sales   Call Centre  002 
30/04/2012  Sales   Call Centre  003 
30/04/2012  Sales   Store    004 
30/04/2012  Marketing       005 
30/04/2012  Marketing  TV    006 

等。

我後是輸出: 前5在劃分級別(不考慮子司)每個月 前5在每個分部層次每個月

樣本輸出:

 
Date   Top5Areas  Volume 
31/05/2012 Sales   100 
31/05/2012 Marketing  90 
31/05/2012 HR   50 
30/04/2012 Sales   100 
30/04/2012 Marketing  90 
30/04/2012 HR   50 
And depending on the level the sub division for the respective area:
 
Date   Top5Areas  Volume 
31/05/2012 Call Centre 100 
31/05/2012 Store   90 
31/05/2012 HR   50 
but with 5 for each group.

I'm not should how to do this and wonder if I'll need to build up the result through a number of queries or whether there is a better way.

Thanks in advance and appreciate your suggestions.

 
    SELECT [TableA].[DisplayVar] AS DisplayVar, [TableB].[Date] AS MonthDate, TableC.  [Divison] AS Divison, Volume 
    FROM (SELECT [TableA].[DisplayVar], 
    [TableB].[Date], 
    TableC.[Divison], 
    Volume 
     ( SELECT COUNT() + 1 FROM ( SELECT [TableA].[DisplayVar], [TableB].[Date], TableC.[Divison], COUNT()  AS Volume 
     FROM ([TableA] INNER JOIN [TableB] ON [TableA].[ID] = [TableB].[ID]) LEFT JOIN  TableC ON [TableB].ID = TableC.Descriptor 
     GROUP BY [TableA].[DisplayVar], [TableB].[Date], TableC.[Divison] 
    ) AS T 
     WHERE T.[TableB].[Date] = Data.[TableB].[Date] 
     AND  T.Volume > Data.Volume 
    ) AS Rank 
    FROM ( SELECT [TableA].[DisplayVar], [TableB].[Date], TableC.[Divison], COUNT(*)  AS Volume 
     FROM ([TableA] INNER JOIN [TableB] ON [TableA].[ID] = [TableB].[ID]) LEFT JOIN  TableC ON [TableB].ID = TableC.Descriptor 
     WHERE [TableB].[Date] BETWEEN Date() AND DateADD("m", -12, Date())
GROUP BY[TableA].[DisplayVar], [TableB].[Date], TableC.[Divison] ) AS DATA ) AS Data WHERE (((Data.Rank)<=5)) ORDER BY [TableB].[Date] DESC , Volume DESC;

+0

好點。將是該部門的計數/頻率 – user1407577

回答

0

The only way I can think of to do a top n per date (Which is what I think you are after) in access is to use a correlated subquery. I think the simplest method is similar to using the ROW_NUMBER()功能在其他DBMS,它增加了一個附加的字段,以您的一部開拓創新聚集查詢給每個分割/日期的秩時,最外面的where子句它限制到行其中秩小於或等於5。

SELECT Date, 
     Division, 
     Volume 
FROM ( SELECT Date, 
        Division, 
        Volume, 
        ( SELECT COUNT(*) + 1 
         FROM ( SELECT Date, Division, COUNT(*) AS Volume 
            FROM YourTable 
            GROUP BY Date, Division 
           ) AS T 
         WHERE T.Date = Data.Date 
         AND  T.Volume > Data.Volume 
        ) AS Rank 
      FROM ( SELECT Date, Division, COUNT(*) AS Volume 
         FROM YourTable 
         WHERE Date BETWEEN DATE() AND DATEADD("m", -12, DATE()) 
         GROUP BY Date, Division 
        ) AS DATA 
     ) AS Data 
WHERE Rank <= 5 

垮臺(或收益取決於喲你的要求),這是它不處理關係,即如果你有10個相同的音量,所有10個將被返回,而不僅僅是5個。

我不知道如果這是你需要什麼,但希望至少讓你在正確的方向前進。

+0

謝謝GarethD。現在看第一個代碼。但意識到我需要在日期字段的時間段條件例如:HAVING((([Table]。[Date])Date()和DateAdd(「m」, - 12,Date())))但認爲有有問題和訂購 – user1407577

+0

使用'WHERE'不'HAVING'因爲Date是在分組列表中,所以不需要使用'HAVING'。我已經編輯了兩個查詢來展示這一點。 – GarethD

+0

我掙扎得到WHERE卷> =(選擇在第一個例子中的工作MIN(卷),但希望它會制定得來確認「T」就行了? - FROM YourTable是錯誤 – user1407577