访问数据库,通过最大问题选择组

时间:2009-04-23 17:50:24

标签: sql database ms-access

访问数据库中的

... 我需要提取下表中每个项目代码的itemcode / desc组合,其中最常使用desc。

最常见的可能意味着只有一个版本(参见梨的附加记录)

对于 itemcode 777 ,我将在稍后决定使用哪个描述版本。如果有多个记录,每个记录包含一个版本的描述,那么肯定会产生一个额外的问题。

原始问题可能还应包括返回项目代码(如777)的第一行,其中itemcode的所有现有记录都包含单个唯一描述(因此计数始终为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 个答案:

答案 0 :(得分:3)

这可以通过相关的子查询来实现:

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关键字,只是避免它们让你的生活更轻松。

答案 1 :(得分:0)

您的查询返回MAX。找到一种方法来创建满足您要求的规则。

“看似最频繁”的意思是什么?出现大于2?出现→3?出现> 4 ...

答案 2 :(得分:0)

修复并测试过。它可以像预期的那样工作 - 或者设计得更好,因为如果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
   )

<强>更新

稍微简化了查询。

<强>更新

无法验证它是否适用于Access 2003.尝试过,但Access一直要求I1.ItemCode

答案 3 :(得分:-1)

等等,为什么你不能按照点票顺序排在前面,无论你想要多少?我误解了你的问题吗?例如......

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吗? :)

啊,访问!我放弃了!