2

トップ 5 を使用して、いくつかの基準のトップ 5 を取得したいと思います。

データ スタイルは、月日、エリア 1、サブエリア 1、サブエリア 2 など、タイプ、各行の一意の識別子です。

私がやろうとしているのは、各月と地域の上位 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
そして、レベルに応じて、それぞれのエリアのサブディビジョン:
Date          Top5Areas     Volume
31/05/2012    Call Centre   100
31/05/2012    Store         90
31/05/2012    HR            50 
ただし、各グループに 5 を使用します。

これを行う方法はわかりません。多くのクエリを実行して結果を構築する必要があるかどうか、またはより良い方法があるかどうか疑問に思います。

事前に感謝し、あなたの提案に感謝します.

    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;

4

1 に答える 1

0

アクセスで日付ごとにトップnを実行するために私が考えることができる唯一の方法は、相関サブクエリを使用することです。最も簡単な方法は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 個のディビジョンがある場合、5 個だけでなく 10 個すべてが返されます。

これがまさにあなたが必要としているものかどうかはわかりませんが、うまくいけば、少なくとも正しい方向に進むことができます.

于 2012-06-15T08:21:57.640 に答える