在访问中编写一个带有明显计数的查询
我在写一个查询时遇到了一些困难,这意味着要显示生产3个或更多不同速度的笔记本电脑的“制造商”。在访问中编写一个带有明显计数的查询
SELECT DISTINCT Product.maker, Count(Laptop.speed) AS [3+ Different Speeds]
FROM Laptop INNER JOIN Product ON Laptop.model = Product.model
WHERE type = "laptop"
GROUP BY Product.maker
HAVING Count(*) >= 3;
这给了我2个正确的“制造商”产生3个或更多型号的笔记本电脑,但是,一个“制造者”,A,产生两个型号的笔记本电脑以相同的速度,使“制造商”必须从下面的结果表中删除。
maker 3+ Different Speeds
A 3
E 3
这里就是模型和速度数据存储在笔记本电脑桌:
model speed
2001 2.00 E
2002 1.73 E
2003 1.80 E
2004 2.00 A
2005 2.16 A
2006 2.00 A
Ë产生前3名,而A产生底部3.我相当肯定,我需要做我的Count函数DISTINCT,但是,我知道Access不支持DISTINCT Count。任何援助/建议将不胜感激!
下面的查询应该可以解决您的问题。
SELECT
maker,
COUNT(speed)
FROM(
SELECT
p.maker,
l.speed
FROM
Laptop l
INNER JOIN Product p
ON l.model = p.model
WHERE
type = "laptop"
GROUP BY 1,2
) foo
GROUP BY 1
HAVING COUNT(1) >= 3
首先你聚集所有速度为同一制造商,所以内部查询会产生:
maker | speed | count
-------+-------+-------
E | 1.73 | 1
E | 1.80 | 1
A | 2.16 | 1
E | 2.00 | 1
A | 2.00 | 2
现在你对每对不同行(制造商,速度),这样就可以简单地运行一个COUNT()
超速。
结果
maker | count
-------+-------
E | 3
A | 2
现在消除A和HAVING
条款。
如果您取出distinct关键字,则您的查询将正常工作。如果您仅由制造商进行分组,那么该查询将仅为每个制造商带回一个记录,而区别实际上是多余的。
这不包括问题。 – 2014-11-03 09:42:43
虽然你说的是正确的,但并不能解决问题。结果仍然显示A和E.A应该省略,因为它会以相同的速度生成两个模型。 – Chris 2014-11-03 09:45:22
这是我想出的WORKING查询,是您提供给我的一个稍微修改过的版本。
SELECT P.maker AS [Maker], Count(L.speed) AS [3+ Different Speeds]
FROM (SELECT P.maker, L.speed FROM Laptop AS L INNER JOIN Product AS P ON L.model = P.model
WHERE type = "laptop"
GROUP BY P.maker, L.speed)
GROUP BY [Maker]
HAVING Count(L.speed) >= 3;
再次感谢!
这实际上正是我写的,但具有不同的格式。我正在使用GROUP BY X别名来指向SELECT语句的列。无论如何,很高兴它的作品。 – 2014-11-03 10:32:00
我注意到了。你有第三次没有必要的Count()函数,但除此之外,它正是我所期待的! – Chris 2014-11-03 10:34:03
你说得对。测试后我忘记将其移除。 – 2014-11-03 10:36:25
在稍微修改了您提供给我的内容后,我能够成功运行它。感谢您的帮助! – Chris 2014-11-03 10:25:35
我很高兴能帮上忙。如果满意,接受答案。你能否让我知道你有什么修改? – 2014-11-03 10:29:45
我刚刚发布了最终的代码。 – Chris 2014-11-03 10:31:44