Access 2002 - как группировать записи и N лучших записей в одном запросе - PullRequest
0 голосов
/ 26 мая 2009

У меня есть данные, которые выглядят следующим образом:

Group     Product    PercentAch
Gr1       Pr1        55%
Gr1       Pr2        65%
Gr2       Pr1        45%
Gr2       Pr2        95%
Gr3       Pr1        15%
Gr3       Pr2        35%
.
.
.

Таким образом, в основном данные описывают набор отдельных продуктов, которые относятся к разным группам. Я пытаюсь создать запрос, который будет получать для меня верхние N% записей на основе PercentAch по продуктам по группам. В файле справки Access указывается сортировка по PercentAch, чтобы использовать свойство TOP, но это приводит к смешиванию групп и продуктов. Другой вариант - создать отдельный запрос для каждой комбинации Группа / Продукт, который кажется излишним. Есть ли способ сделать это, используя только один (или два) запроса?

Ответы [ 5 ]

3 голосов
/ 07 августа 2012

Вам необходимо использовать уникальный идентификатор, в противном случае, если у вас есть несколько продуктов в одной группе с одним и тем же PercentAch, вы получите все эти продукты ... т.е. больше, чем на 5% больше, чем вы хотели. Предположим, у нас есть уникальный идентификатор продукта. SQL будет:

SELECT Group, ProductID, Product, PercentAch
FROM SalesPerformance
WHERE ProductID IN (
    SELECT TOP 5 PERCENT ProductID
    FROM SalesPerformance as S
    WHERE S.Group = SalesPerformance.Group
    ORDER BY PercentAch DESC
);
1 голос
/ 26 мая 2009

Вот ваш ответ. Извините, но мне потребовалось некоторое время, чтобы обдумать это. Я знал, что видел это раньше:

ACC: как создать лучшие N значений для группового запроса: http://support.microsoft.com/kb/153747

0 голосов
/ 04 сентября 2011

Я пытался выяснить точно такую ​​же проблему большую часть дня. Получается, что ответом было просто добавить Product к предложению WHERE подзапроса.

SELECT Group, Product, PercentAch
FROM SalesPerformance
WHERE PercentAch IN (
    SELECT TOP 5 PERCENT PercentAch 
    FROM SalesPerformance as S
    WHERE S.Group = SalesPerformance.Group and S.Product = SalesPerformance.Product
    ORDER BY PercentAch DESC
);

Это дало мне 5% лучших значений PercentAch для каждой комбинации Группа / Продукт.

0 голосов
/ 28 мая 2009

Джей, вот оно:

SELECT Group, Product, PercentAch
FROM SalesPerformance
WHERE PercentAch IN (
    SELECT TOP 5 PERCENT PercentAch 
    FROM SalesPerformance as S
    WHERE S.Group = SalesPerformance.Group
    ORDER BY PercentAch DESC
);

Вы хотели 5 лучших записей в каждой группе или только 5 лучших? Если вы просто хотите, чтобы первые 5 записей в каждой группе были удалены из запроса, ключевое слово PERCENT.

0 голосов
/ 26 мая 2009

Вам нужно два запроса. Для запроса Top требуется вывод из запроса группировки. Если вы попытаетесь поместить Top в тот же запрос, что и Group, Top будет действовать на исходные исходные данные, а не на сгруппированные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...