我在编写一个查询时遇到了一些困难,这些查询旨在显示生产具有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
这是存储模型和速度数据的Laptop表:
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
E产生前三个,A产生底部3.我很确定我需要使用我的Count函数DISTINCT,但是,我知道Access不支持DISTINCT Count。任何帮助/建议将不胜感激!
答案 0 :(得分:1)
以下查询可以解决您的问题。
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
现在用HAVING
子句删除A.
答案 1 :(得分:0)
如果您取出distinct关键字,您的查询将正常工作。如果您只按制造商分组,那么该查询将为您返回每个制造商只有一条记录,而分离实际上是多余的。
答案 2 :(得分:0)
这是我提出的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;
再次感谢!