2005-08-29

SQL中的GROUP BY 子句

SQL中的GROUP BY子句 支持GROUP ING SETS,ROLLUP,CUBE选项。

GROUPING SETS

GROUPING SETS允许用户精确制定进行哪些特定的分组操作,如:
SELECT s#, p#, SUM(QTY) AS TOTQTY
FROM SP
GROUPING BY GROUPING SETS (s#, p#);


GROUPING BY子句会要求系统有效地执行两个查询,一个按s#分组,另一个按p#分组, 但是SQL会把这些分离的查询的结果放到一个表中。

ROLLUP

ROLLUP和CUBE可以看作是由一些GROUP ING SETS组和而成。如:
SELECT s#, p#, SUM(QTY) as TOTQTY
FROM SP
GROUP BY ROLLUP(s#, p#);

上面的GROUP BY 语句等同于
GROUP BY GROUP ING SETS ((s#, p#), (s#), ())
这儿的ROLLUP指对每个供应商进行数量上卷(即沿着s#维上卷)。通常,GROUP BY ROLLUP (A, B, …, Z),“沿着A维上卷”,指的是“按下面的组合进行分组”:
(A, B, …, Z)
(A, B, …)

(A, B)
(A)
( )

注意:通常存在多个分离的“沿着A维上卷”(根据ROLLUP中勇逗号分开的列来确定)。另外,GROUP BY ROLLUP(A, B)与GROUP BY ROLLUP(B, A)的含义是不同的,即GROUP BY ROLLUP(A, B)中的A和B不具有对称性。

CUBE

SELECT s#, p#, SUM(QTY) AS TOTOTY
FROM SP
GROUP BY CUBE(s#, p#);

其中的GROUP BY CUBE(s#, p#);等同于:
GROUP BY GROUP ING SETS ((s#, p#), (s#), (p#), ())

GROUP BY CUBE (A, B, …, Z) 等价于“按集合{A, B, … , Z}的所有可能的子集分组”。

在一个GROUP ING BY子句中可以包括多个GROUP ING SETS,ROLLUP和CUBE。

没有评论:

发表评论