Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 对查询结果进行汇总、分组和排序 » GROUP BY 子句:将查询结果划分为组

 

GROUP BY 和 SQL/2008 标准

与 SQL Anywhere 支持的语法相比,SQL/2008 标准在语法方面的限制相当多。在 SQL/2008 标准中,对 GROUP BY 的要求如下:

  • GROUP BY 子句中指定的每一个 group-by-term 都必须是列引用:也就是对在查询的 FROM 子句中引用的表中的列的引用。这些表达式称为分组列

  • SELECT 列表、HAVING 子句或 ORDER BY 子句中的表达式如果不是集合函数,则必须是分组列,或者只能引用分组列。但是,如果支持可选的 SQL/2008 语言功能 T301 "功能依赖性",则此类引用可以引用查询的 FROM 子句中由分组列的函数来确定的列。

在 SQL Anywhere 中的 GROUP BY 子句内,group-by-term 可以是包括列引用、文字常量、变量或主机变量,以及标量和用户定义函数的任意表达式。例如,此查询根据 Salary 列将 Employee 表分成三组,每组生成一行:

SELECT COUNT() FROM Employees 
   GROUP BY (
      IF SALARY < 25000 
         THEN 'low range' 
      ELSE IF Salary < 50000 
         THEN 'mid range' 
      ELSE 'high range' 
         ENDIF 
      ENDIF);

要使查询结果中包括分区值,必须将 group-by-term 添加到查询 SELECT 列表中。为了在语法上有效,SQL Anywhere 确保 SELECT 列表项的语法与 group-by-term 相同。但是,在语法上大的 SQL 结构会导致此分析失败;而且,比较包含子查询的表达式时从不相等。

在下面的示例中,SQL Anywhere 检测到两个 IF 表达式相等,并计算结果,但未产生错误:

SELECT (IF SALARY < 25000 THEN 'low range' ELSE IF Salary < 50000 THEN 'mid range' ELSE 'high range' ENDIF ENDIF), COUNT() 
FROM Employees 
GROUP BY (IF SALARY < 25000 THEN 'low range' ELSE IF Salary < 50000 THEN 'mid range' ELSE 'high range' ENDIF ENDIF);

但是,以下在 GROUP BY 子句中包含子查询的查询会返回错误:

SELECT (Select State from Employees e WHERE e.EmployeeID = e2.EmployeeID), 
      COUNT() 
   FROM Employees e2
   GROUP BY (Select State from Employees e WHERE EmployeeID = e2.EmployeeID)

更精确的方法是为 SELECT 列表表达式赋予别名,并在 GROUP BY 子句中引用该别名。使用别名允许 SELECT 列表和 GROUP BY 子句包含相关子查询。这种使用 SELECT 列表别名的方法是服务商扩充:



SELECT (
   IF SALARY < 25000 
      THEN 'low range' 
   ELSE IF Salary < 50000 
      THEN 'mid range' 
   ELSE 'high range' 
      ENDIF
   ENDIF) AS Salary_range, 
   COUNT() FROM Employees GROUP BY Salary_Range;

虽然 SQL Anywhere 不支持 SQL/2008 语言功能 T301(功能依赖性)的所有方面,但 SQL Anywhere 确实提供一些对基于 GROUP BY 条件的派生值的支持。SQL Anywhere 支持的 SELECT 列表表达式可引用 GROUP BY 条件、文字常量和(主机)变量,还可以使用可能修改这些值的标量函数。例如,以下查询按城市/州组合列出雇员数:

SELECT City || ' ' || State, SUBSTRING(City,1,3), COUNT() 
FROM Employees 
GROUP BY City, State

有关使用 SQL Anywhere 集合函数的更多标准遵从性信息,请参见集合函数和外部引用

 另请参见