在Access中编写具有不同计数的查询

时间:2014-11-03 09:23:51

标签: sql ms-access

我在编写一个查询时遇到了一些困难,这些查询旨在显示生产具有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。任何帮助/建议将不胜感激!

3 个答案:

答案 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;

再次感谢!