kingbase(人大金仓数据库)GROUP BY使用

2022-04-01 00:00:00 函数 产品 表达式 分组 聚集

kingbase数据库分组查询时,GROUP BY字段如果为主键,则查询的列不需要都里包含在GROUP BY中,否则需要。

GROUP BY 子句被用来把表中在所列出的列上具有相同值的行分组在一起。 这些列的列出顺序并没有什么关系。其效果是把每组具有相同值的行组合为一个组行,它代表该组里的所有行。 这样就可以删除输出里的重复和/或计算应用于这些组的聚集。例如

=> SELECT * FROM test1;
x | y
---+---
a | 3
c | 2
b | 5
a | 1
(4 rows)

=> SELECT x FROM test1 GROUP BY x;
x
---
a
b
c
(3 rows)
在第二个查询里,不能写成SELECT * FROM test1 GROUP BY x,因为列y里没有哪个值可以和每个组相关联起来。被分组的列可以在选择列表中引用是因为它们在每个组都有单一的值。

通常,如果一个表被分了组,那么没有在GROUP BY中列出的列都不能被引用,除非在聚集表达式中被引用。 一个用聚集表达式的例子是:

=> SELECT x, sum(y) FROM test1 GROUP BY x;
x | sum
---+-----
a | 4
b | 5
c | 2
(3 rows)


这里的sum是一个聚集函数,它在整个组上计算出一个单一值。有关可用的聚集函数的更多信息可以在 聚集函数 。

Tip

没有聚集表达式的分组实际上计算了一个列中可区分值的集合。也可以用DISTINCT子句实现(参阅 DISTINCT )。

此例计算每种产品的总销售额(而不是所有产品的总销售额):

SELECT product_id, p.name, (sum(s.units) * p.price) AS sales FROM products p LEFT JOIN sales s USING (product_id) GROUP BY product_id, p.name, p.price;

如果产品表被建立起来,例如product_id是主键,那么在上面的例子中用product_id来分组就够了,因为名称和价格都是函数依赖于产品ID,并且关于为每个产品ID分组返回哪个名称和价格值就不会有歧义。
————————————————
版权声明:本文为CSDN博主「影子_翃宇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_59158648/article/details/120038783

相关文章