... 我需要提取下表中每个项目代码的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
答案 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吗? :)
击>
啊,访问!我放弃了!