按组计数(GROUP BY)和计数(COUNT)未产生预期结果

10

我正在做一些SQL练习,但我卡在了一个我将要描述的问题上。

有一个名为product的表,它有3列:maker、model和type。

这是select * from product的结果:

enter image description here

练习内容如下: 找出只生产同一类型型号数量超过1的制造商。 推导出:maker,type。

正确的查询应返回如下结果:

enter image description here

我的方法是首先查看哪些制造商只生产一种类型的产品,然后排除那些只有一个型号的制造商。为了达到这个目的,我使用了以下查询,它返回了正确的结果,但事实上我只能显示制造商而无法显示类型,而且练习要求两者都需要呈现。

这是我的查询:

SELECT
DISTINCT maker
FROM product
GROUP BY maker
HAVING COUNT(distinct type) = 1 
AND
COUNT(model)> 1

结果如下:

enter image description here

然后,当我尝试这样显示类型时:

SELECT
DISTINCT maker,type
FROM product
GROUP BY maker,type
HAVING COUNT(distinct type) = 1 
AND
COUNT(model)> 1

这就是我得到的:

在此输入图片描述

你有没有想法,为什么它不能按预期工作?你会怎么做来解决这个问题?我已经尝试了3个多小时,但没有成功。:( 请帮帮我。


这是第几个练习? - llamerr
4
奖励提示:在同一个SELECT级别中,您永远不应该同时使用DISTINCT和GROUP BY。虽然这样做从理论上讲不是必要的(DISTINCT实际上只是GROUP BY的简化/缩减形式),但它经常会导致混淆,并具有意外和不一致结果的潜力。(我不认为这是这里的问题。) - RBarryYoung
哦,我还没有完成那个,所以我会闭上眼睛停止理解答案。 - llamerr
1
@llamerr 我完成了1到25,但我跳过了14,因为我已经在上面工作了将近两个小时,然后回来继续。 - Alex Terreaux
6个回答

16

如果你只想返回那些只包含一个类型的组,那么你可以使用MAX/MIN来找出该组中的type是什么。

SELECT maker,
       MAX(type) AS type
FROM   product
GROUP  BY maker
HAVING COUNT(DISTINCT type) = 1
       AND COUNT(model) > 1 

当你在GROUP BY列表中添加type时,它会为每个maker,type组合提供一个结果行,这就是为什么你的第二次尝试不起作用的原因。


谢谢,这样做并没有起作用,我只是从组类型中删除了类型,就解决了问题。非常感谢! - Alex Terreaux
MAX应用于包含“PC”、“笔记本电脑”、“打印机”等非数值的列,它是如何工作的?它计算了什么最大值? - user734063
1
@user734063 它返回将被排序到最后的值。 - Martin Smith

5
SELECT DISTINCT maker, type 
FROM product 
WHERE maker IN 
   (SELECT DISTINCT maker 
    FROM product 
    GROUP BY maker HAVING COUNT(distinct type) = 1
    AND count(model) > 1)

1
SELECT
DISTINCT maker, type
FROM makertype
GROUP BY maker
HAVING COUNT(distinct type) = 1 
AND
COUNT(ident)> 1

你正在尝试在第二个查询中按制造商和类型分组,这将隔离具有仅一个类型的任何制造商和类型组合(这始终为真,因为每个组包含一个不同的制造商和类型对)和两个或更多型号。你只想按制造商分组。

0
SELECT MAKER,MAX(TYPE)
 FROM PRODUCT
 GROUP  BY MAKER
 HAVING  COUNT(*)>1  AND  MAX(TYPE)=MIN(TYPE)

0
    select distinct product.maker, product.type from product, (SELECT maker

    FROM product

    GROUP BY maker

    HAVING COUNT(distinct type) = 1 

           AND

           COUNT(model)> 1) as x

    where x.maker=product.maker

试试这个。对我有用。


0

试试这个:

select maker, max(type) as type from Product
Group by maker
Having count (Distinct type) = 1 and Count(maker)>1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接