使用 GROUP BY 分组行 [SQL Server]

时间:2022-02-02 03:01:35

Group By 子句用于对结果集进行分组,并对每一组数据进行汇总计算。

语法格式:

Group By  [列名]  [HAVING  条件表达式]

Group By按“列名”指定的列进行分组,将该列列值相同的记录组成一组,并对每一组进行汇总计算。每一组生成一条记录。若有“HAVING  条件表达式”,则表示对生成的组进行筛选。

 

假如,TableX 表包含

--------------------------------

ColumnA  ColumnB  ColumnC


1      abc       5

1      def      4

1      ghi      9

2      jkl       8

2      mno      3


如果 ColumnA 是组合列,则结果集中最终将有两行,其中一行汇总值 1 的信息,而另一行汇总值 2 的信息。

如果 ColumnA 是组合列,要引用 ColumnBColumnC,这两列必须是能为 ColumnA 中的每个值返回单个值的聚合函数中的参数。选择列表中可以包含诸如 MAX (ColumnB)、SUM (ColumnC) 或 AVG (ColumnC) 之类的表达式:

  
  
  
SELECT ColumnA,
MAX(ColumnB) AS MaxB,
SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA

此选择语句返回两行,为 ColumnA 中的每个唯一值各返回一行:

ColumnA     MaxB     SumC        
----------- ---- ----------- 
1                ghi           18          
2                mno          11          
(2 row(s) affected)

但是,选择列表中不能只包含 ColumnB 表达式:

  
  
  
SELECT
ColumnA,
ColumnB,
SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA

  由于 GROUP BY 只能返回一行,该行在 ColumnA 中的值为 1,因此无法返回与 ColumnA 中的值 1 关联的 ColumnB 中的三个值(abc、def 和 ghi)。

不能对 ntexttextimagebit 列使用 GROUP BY 或 HAVING,除非它们所在的函数返回的值属于其他数据类型。这样的函数包括 SUBSTRING 和 CAST。