1、解釋:Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是根據給定數據列的每個成員對查詢結果進行分組統計,最終得到一個分組匯總表
2、常見用法:
創建客戶信息庫(customers)
create table customers( customersid int identity(1,1) not null, name nvarchar(50), city nvarchar(50), customerstype nvarchar(50), addtime date, adddepartment nvarchar(10), quantity int )
插入數據語句
insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('張三','中國','普通客戶','2010-10-23','財務部',3) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('李四','法國','主要客戶','2012-11-1','銷售部',2) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('王五','中國','普通客戶','2011-1-12','編輯部',12) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('王六','德國','特殊客戶','2011-1-12','編輯部',5) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('馬七','中國','主要客戶','2012-2-29','財務部',3) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('趙八','德國','特殊客戶','2010-4-23','財務部',6) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('錢九','美國','特殊客戶','2011-6-16','編輯部',2) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('孫十','中國','主要客戶','2012-12-2','銷售部',7) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('張四','法國','特殊客戶','2010-11-2','編輯部',2) insert into customers(name,city,customerstype,addtime,adddepartment,quantity) values('張五','中國','普通客戶','2012-11-23','銷售部',1)
表查詢結果如下
customersid name city customerstype addtime adddepartment quantity
1 張三 中國 普通客戶 2010-10-23 財務部 3
2 李四 法國 主要客戶 2012-11-01 銷售部 2
3 王五 中國 普通客戶 2011-01-12 編輯部 12
4 王六 德國 特殊客戶 2011-01-12 編輯部 5
5 馬七 中國 主要客戶 2012-02-29 財務部 3
6 趙八 德國 特殊客戶 2010-04-23 財務部 6
7 錢九 美國 特殊客戶 2011-06-16 編輯部 2
8 孫十 中國 主要客戶 2012-12-02 銷售部 7
9 張四 法國 特殊客戶 2010-11-02 編輯部 2
10 張五 中國 普通客戶 2012-11-23 銷售部 1
2.1 group by [ ]
這個是 group by 最常見的用法 ,group by [分組的字段1,分組字段2….]
例如:對customers 根據 customerstype 進行分組
語句: select customerstype from customers group by customerstype 運行結果如下 customerstype 普通客戶 特殊客戶 主要客戶
解釋:1、SELECT子句中的列名必須為分組列或列函數
2、列函數對於GROUP BY子句定義的每個組各返回一個結果”,根據customerstype分組,對每個類型返回一個結果
2.2 group by 常和 sum,max,min ,count 等聚合函數一起使用
例如:對 customers根據 customerstype 進行分組 統計每個類別中的客戶個
語句: select customerstype,COUNT(*) from customers group by customerstype 運行結果如下 customerstype number 普通客戶 3 特殊客戶 4 主要客戶 3
例如:對 customers根據 customerstype 進行分組 獲取每組的最大customersid
語句: select customerstype,MAX(customersid) as number from customers group by customerstype 運行結果如下 customerstype number 普通客戶 10 特殊客戶 9 主要客戶 8
2.3 group by 字句和where 字句一起使用
在SQL中where字句的運行順序是先於 group by 字句的,where 字句會會在形成組和計算列函數之前消除不符合條件的行
例如:查詢由財務部門添加的用戶各個類型的最大customersid
語句: select customerstype,MAX(customersid) as number from customers where adddepartment='財務部' group by customerstype 運行結果如下 customerstype number 普通客戶 1 特殊客戶 6 主要客戶 5
解釋:where 字句過濾掉了不是 財務部 添加的用戶信息,再對之后的結果進行 group by 操作
2.4 group by 字句和having() 字句一起使用
在SQL 中 having() 字句的運行順序是后於 group by 字句的, having() 字句的的作用是篩選滿足條件的組
例如:查詢客戶數超過1個的國家和客戶數量
語句: select city, count(*) number from customers GROUP by city having count(*)>1 運行結果如下 city number 德國 2 法國 2 中國 5
解釋:系統會先對customers 根據 city 分組,生產虛擬表,之后having 生產的虛擬表進行篩選,將數量不大於1的剔除
2.5 group by 字句和ROLLUP()一起使用
可方便的生成"合計"、"小計"、"總計" 等混合統計的報表
例如語句 SELECT city,customerstype, sum(quantity) quantity FROM customers GROUP BY ROLLUP (city,customerstype) 運行結果如下 city customerstype quantity 德國 特殊客戶 11 德國 NULL 11 法國 特殊客戶 2 法國 主要客戶 2 法國 NULL 4 美國 特殊客戶 2 美國 NULL 2 中國 普通客戶 16 中國 主要客戶 10 中國 NULL 26 NULL NULL 43
解釋:①ROLLUP會為 (city,customerstype)、和 (city) 值的每個唯一組合生成一個帶有小計的行。還將計算一個總計行
②列是按照從右到左的順序匯總的。列的順序會影響 ROLLUP 的輸出分組,而且可能會影響結果集內的行數
2.6 group by 字句和CUBE()一起使用
生成簡單的 GROUP BY 聚合行、ROLLUP 超聚合行和交叉表格行。
CUBE 針對表達式的所有排列輸出一個分組。
例如語句 SELECT city,customerstype, SUM (quantity) quantity FROM customers GROUP BY CUBE (city,customerstype) 運行結果如下 city customerstype quantity 中國 普通客戶 16 NULL 普通客戶 16 德國 特殊客戶 11 法國 特殊客戶 2 美國 特殊客戶 2 NULL 特殊客戶 15 法國 主要客戶 2 中國 主要客戶 10 NULL 主要客戶 12 NULL NULL 43 德國 NULL 11 法國 NULL 4 美國 NULL 2 中國 NULL 26
解釋:①CUBE會為 (city,customerstype)、(city) 和 (customerstype) 值的每個唯一組合生成一個帶有小計的行,還會生成一個總計行。
②CUBE中列的順序不影響 CUBE 的輸出。
2.7 group by all
group by all 需和 where 一起使用,否則all 不起作用,查詢結果中包含又 group by 字句產生的所有分組,即使這些組沒有符合 where 字句的條件 ,這些沒有符合條件的結果會以 null 顯示
例如: select city,SUM(quantity) quantity from customers where quantity>5 group by all city 運行的結果為 city quantity 德國 6 法國 NULL 美國 NULL 中國 19 解釋:其中 法國和美國 quantity 的和值不符合 where 條件,分別為 4 和2,單仍然在查詢的結果中顯示 以上語句,將all 去掉后,運行的結果如下 德國 6 中國 19