2012-06-15 68 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