получить доступ к БД, выбрать группу, имея максимальную проблему - PullRequest
2 голосов
/ 23 апреля 2009

in Access DB ... Мне нужно извлечь комбинацию itemcode / desc для каждого itemcode в следующей таблице, где desc использовался наиболее часто.

чаще всего может означать, что была только одна версия (см. Добавленную запись для груши)

в случае itemcode 777 , позже я должен решить, какую версию описания использовать. если имеется несколько записей, каждая из которых содержит одну версию описания, это определенно создаст дополнительную проблему.

исходный вопрос, вероятно, должен также включать в себя возврат первой строки для кодов элементов, например 777, где все существующие записи для кода элемента содержат одно уникальное описание (так что счетчик всегда будет равен 1). первая строка не всегда может быть правильной версией - но я все равно не смогу автоматизировать эту фазу.

---------------------
itemcode  | desc
---------------------
123       | apple
123       | apple
123       | apple
123       | apple 2
123       | apple-2
001       | orange
001       | orange
001       | ORANGE 1
001       | orange-1
666       | pear
777       | bananananana
777       | banana

итак, я надеюсь получить следующее:

---------------------
itemcode  | desc
---------------------
123       | apple
001       | orange
666       | pear
777       | bananananana

Я думаю, что я близок, но следующее получает только описание в базе данных, которое появляется чаще всего и возвращает только одну строку.

SELECT itemcode, desc, count(desc)
from table
group by itemcode, desc
having count(desc) = 
(
 select max(ct) from 
 (
  select itemcode, desc, count(desc) as ct
  from table
  group by itemcode, desc
  )
);

возвращается:

---------------------
itemcode  | desc
---------------------
123       | apple

Ответы [ 4 ]

3 голосов
/ 23 апреля 2009

Это будет работать через коррелированный подзапрос:

SELECT 
  t.itemcode, t.desc, Count(t.desc) AS CountOfdesc
FROM 
  [table] AS t
GROUP BY 
  t.itemcode, t.desc
HAVING 
  Count(t.desc) IN (
    SELECT TOP 1 
      Count(i.desc)
    FROM 
      [table] AS i
    WHERE 
      i.itemcode = t.itemcode
    GROUP BY 
      i.itemcode, i.desc
    ORDER BY 
      Count(i.desc) DESC
  )
  AND t.desc = (
    SELECT TOP 1 
      i.desc
    FROM 
      [table] AS i
    WHERE 
      i.itemcode = t.itemcode
    GROUP BY 
      i.itemcode, i.desc
    ORDER BY 
      i.desc
  )
;

Возвращает (протестировано с Access 2003):

itemcode  desc          CountOfdesc
001       orange        2
123       apple         3
666       pear          1
777       banana        1

Кстати, вам не следует называть таблицу "table" и столбец "desc". Это зарезервированные ключевые слова SQL, просто избегайте их, чтобы упростить свою жизнь.

0 голосов
/ 23 апреля 2009

Подождите, почему вы не можете просто заказать по количеству и взять верх, сколько хотите? Я неправильно понимаю ваш вопрос? Например ...

SELECT TOP N itemcode, desc, count(desc) AS [Count] FROM table
GROUP BY itemcode, desc
ORDER BY [Count]

Хорошо, как насчет этого ...

;WITH dt AS
(
  SELECT 
  ROW_NUMBER() OVER 
  ( PARTITION BY itemcode ORDER BY COUNT([desc])DESC ) AS 'RowNumber',
  COUNT([desc]) AS [Count],
   itemcode,
   [desc] 
   FROM [table]
   GROUP BY itemcode, [desc]
)
SELECT * FROM dt WHERE dt.RowNumber = 1

Это остановит h8? :)

Аааа Доступ! Я сдаюсь!

0 голосов
/ 23 апреля 2009

Исправлено и проверено. Он работает должным образом - или лучше, чем задумано, потому что он возвращает все строки, если наибольшее количество для ItemCode появляется несколько раз.

SELECT ItemCode, ItemDescription, COUNT(ItemDescription) AS ItemCount
FROM Items I1
GROUP BY ItemCode, ItemDescription
HAVING COUNT(ItemDescription) = 
   (SELECT MAX(ItemCount)
      FROM (
         SELECT COUNT(ItemDescription) AS ItemCount
         FROM Items I2
         WHERE I2.ItemCode = I1.ItemCode
         GROUP BY ItemDescription
      ) I3
   )

UPDATE

Просто немного упростил запрос.

UPDATE

Невозможно проверить, работает ли он с Access 2003. Пробовал, но Access продолжает запрашивать I1.ItemCode.

0 голосов
/ 23 апреля 2009

Ваш запрос возвращает МАКС. Найдите способ создать правило, удовлетворяющее вашим требованиям.

Что "что появляется чаще всего" означает что? появляется> 2? появляется> 3? появляются> 4? ...

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