1. DataBase

1.1. SQL

  • Group by
    SELECT top 2 convert(varchar(4),YEAR([time])) + '-' + convert(varchar(2),MONTH([time])) + '-' + convert(varchar(2),Day([time])) AS mytime,
    count = count(*)
    FROM AD_DisplayRecord
    GROUP BY convert(varchar(4),YEAR([time])) + '-' + convert(varchar(2),MONTH([time])) + '-' + convert(varchar(2),Day([time]))
    order by mytime desc
    
    GROUP BY 组件
    GROUP BY 子句包含以下组件: 
    
    一个或多个自由聚合的表达式。通常是对分组列的引用。
    
    
    ALL 关键字(可选),该关键字指定返回由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。
    
    
    CUBE 或 ROLLUP。
    
    
    通常情况下,HAVING 子句与 GROUP BY 子句一起使用,不过也可以单独指定 HAVING 子句。 
    只要表达式中不包括聚合函数,就可通过该表达式分组,例如:
    
    SELECT DATEPART(yy, HireDate) AS Year,
           COUNT(*) AS NumberOfHires
    FROM Northwind.dbo.Employees
    GROUP BY DATEPART(yy, HireDate)
    
    下面是结果集。
    
    Year     NumberOfHires
    1992     3
    1993     3
    1994     3
    
    (3 row(s) affected)
    
    在 GROUP BY 子句中,必须指定表或视图列的名称,而不是使用 AS 子句指派的结果集列的名称。例如,以 GROUP BY Year 替换 GROUP BY DATEPART(yy, HireDate) 子句是不合法的。
    
    可以在 GROUP BY 子句中列出多个列以嵌套组,即可以通过列的任意组合分组表。例如,以下查询按类型和出版商 ID 分组,得到平均价格和 year-to-date 的销售额总和:
    
    USE pubs
    SELECT type, pub_id, 'avg' = AVG(price), 'sum' = sum(ytd_sales)
    FROM titles
    GROUP BY type, pub_id
    
    
    使用 GROUP BY 分组多行
    GROUP BY 子句用来为结果集中的每一行产生聚合值。如果聚合函数没有使用 GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。
    
    以下示例返回分类 2 中每种产品已销售的单位数量:
    
    USE Northwind
    SELECT OrdD.ProductID AS ProdID,
           SUM(OrdD.Quantity) AS AmountSold
    FROM [Order Details] AS OrdD JOIN Products as Prd
         ON OrdD.ProductID = Prd.ProductID
         AND Prd.CategoryID = 2
    GROUP BY OrdD.ProductID
    
    下面是结果集:
    
    ProdID      AmountSold  
    ----------- ----------- 
    3           328         
    4           453         
    5           298         
    6           301         
    8           372         
    15          122         
    44          601         
    61          603         
    63          445         
    65          745         
    66          239         
    77          791         
    
    (12 row(s) affected)
    
    GROUP BY 关键字后面跟着列的列表,称为分组列。GROUP BY 子句限制结果集中的行;对于分组列中的每个非重复值只有一行。每个结果集行都包含与其分组列中特定值相关的汇总数据。
    
    当 SELECT 语句中包含 GROUP BY 关键字时,对可以在选择列表中指定的项有一些限制。在该选择列表中所允许的项目是: 
    
    分组列。
    
    
    为分组列中的每个值只返回一个值的表达式,例如将列名作为其中一个参数的聚合函数。这些函数称为矢量聚合。 
    例如,TableX 包含:
    
    ColumnA ColumnB ColumnC 
    ------- ------- ------- 
    1 abc 5 
    1 def 4 
    1 ghi 9 
    2 jkl 8 
    2 mno 3 
    
    
    
    如果 ColumnA 是分组列,则结果集中将有两行,其中一行汇总值 1 的信息,而另一行汇总值 2 的信息。
    
    如果 ColumnA 是分组列,要引用 ColumnB 或 ColumnC,这两列必须能为 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)。
    
    不能对 ntext、text、image 或 bit 列使用 GROUP BY 或 HAVING 子句,除非它们所在的函数返回的值具有其它数据类型。这样的函数包括 SUBSTRING 和 CAST。