GBase 8c
其他
文章

GBase 8c 表表达式-HAVING子句

发表于2023-12-07 09:02:5153次浏览3个评论

如果一个表已经用GROUP BY子句分了组,然后你又只对其中的某些组感兴趣, 那么就可以用HAVING子句,它很象WHERE子句,用于从结果中删除一些组。其语法是:

SELECT select_list FROM ... [WHERE ...] GROUP BY ... HAVING boolean_expression

在HAVING子句中的表达式可以引用分组的表达式和未分组的表达式(后者必须涉及一个聚集函数)。

例子:

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;

 x | sum

---+-----

 a |   4

 b |   5

(2 rows)

 

=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < 'c';

 x | sum

---+-----

 a |   4

 b |   5

(2 rows)

再次,一个更现实的例子:

SELECT product_id, p.name, (sum(s.units) * (p.price - p.cost)) AS profit

    FROM products p LEFT JOIN sales s USING (product_id)

    WHERE s.date > CURRENT_DATE - INTERVAL '4 weeks'

    GROUP BY product_id, p.name, p.price, p.cost

    HAVING sum(p.price * s.units) > 5000;

在上面的例子里,WHERE子句用那些非分组的列选择数据行(表达式只是对那些最近四周发生的销售为真)。 而HAVING子句限制输出为总销售收入超过 5000 的组。请注意聚集表达式不需要在查询中的所有地方都一样。

如果一个查询包含聚集函数调用,但是没有GROUP BY子句,分组仍然会发生:结果是一个单一行(或者根本就没有行,如果该单一行被HAVING所消除)。它包含一个HAVING子句时也是这样,即使没有任何聚集函数调用或者GROUP BY子句。

评论

登录后才可以发表评论
崔哥发表于 8个月前
满地霜华浓似雪。人语西风,瘦马嘶残月。一曲阳关浑未彻。车声渐共歌声咽。换尽天涯芳草色。陌上深深,依旧年时辙。自是浮生无可说。人间第一耽离别。
用户头像
GBase用户28017发表于 6个月前
好。
茵陈发表于 2个月前
厉害了