HAVING子句在这里实际发生了什么?

use*_*312 -2 sql group-by having oracle11g having-clause

这是SQL Fiddle链接.

根据我的理解,GROUP BY将返回2个元组.

MODEL                        ITEM_TYPE                             PRICE
---------------------------- ------------------------------------- ----------
010-99-0101                  BACKPACK                              5329.1 
626-21-1500                  BACKPACK                              1485.86 
Run Code Online (Sandbox Code Playgroud)

平均价格的价值是,

AVG(PRICE)
----------
4858.014444 
Run Code Online (Sandbox Code Playgroud)

因此,以下查询应筛选出较小的价格值.

SELECT      item_type, MODEL, items.price
FROM        ITEMS
WHERE       MANUFACTURER_NAME = 'UWZ' 
AND         ITEM_TYPE = 'BACKPACK'
GROUP   BY item_type, items.price, MODEL
HAVING      ITEMS.PRICE > AVG(ITEMS.PRICE);
Run Code Online (Sandbox Code Playgroud)

所以,输出应该是:

MODEL                        ITEM_TYPE                             PRICE
---------------------------- ------------------------------------- ----------
010-99-0101                  BACKPACK                              5329.1 
Run Code Online (Sandbox Code Playgroud)

但是,实际上,以下是输出:

产量

no rows selected
Run Code Online (Sandbox Code Playgroud)

Ste*_*ers 5

认为这个查询完成了你想要的工作:

SELECT MODEL, ITEM_TYPE, PRICE
FROM ITEMS
WHERE MANUFACTURER_NAME = 'UWZ'
  AND ITEM_TYPE = 'BACKPACK'
  AND PRICE > 
      (SELECT AVG(ITEMS.PRICE)
       FROM   ITEMS
       WHERE  MANUFACTURER_NAME = 'UWZ' 
       AND    ITEM_TYPE = 'BACKPACK');
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示

说明

您尝试使用的GROUP BY效果不佳.您可以在已发布查询的此修改中看到此内容- 该HAVING子句已被删除,并添加了一列来计算每个组中的项目数:每个只有1个.GROUP BY可以用来计算平均值,但是一旦计算了这个平均值,它就是需要挑选出的各个行 - 当它们被聚合到一个组中时无法完成.因此需要两个单独的操作 - 用于查找平均值的聚合函数和用于选择感兴趣的行的选择.