1. 程式人生 > >SQL Server聚合函式總結

SQL Server聚合函式總結

聚合函式對一組值計算後返回單個值。除了count(統計項數)函式以外,其他的聚合函式在計算式都會忽略空值(null)。所有的聚合函式均為確定性函式。即任何時候使用一組相同的輸入值呼叫聚合函式執行後的返回值都是相同的,無二義性。T-SQL提供的聚合函式一共有13個之多。

  聚合函式通常會在下列場合使用:

   1、select語句的選擇列表,包括子查詢和外部查詢。

   2、使用compute或compute by產生彙總列時。

   3、having子句對分組的資料記錄進行條件篩選。

1、平均值AVG

AVG函式用於計算精確型或近似型資料型別的平均值,bit型別除外,忽略null值。AVG函式計算時將計算一組數的總和,然後除以為null的個數,得到平均值。

語法結構:

avg( [ all | distinct ] expression )  

all:為預設值,表示對所用的資料都計算平均值。

distinct:每個值的唯一值計算平均值,不管相同的值出現多次,多個行相同的值僅僅出現一次作為計算。

expression:精確或近似值的表示式。表示式內部不允許使用子查詢和其他聚合函式。

示例:

--計算所有學生各科成績的平均成績和所有學生成績的總和
select avg(語文)as 語文,AVG(英語)as 英語,AVG(數學) as 數學,AVG(代數) as 代數 from tb_stuAchievement


2、最小值MIN

MIN函式用於計算最小值,MIN函式可以適用於numeric、char、varchar或datetime、money或smallmoney列,但不能用於bit列。不允許使用聚合函式和子查詢,忽略null值。

  語法結構:

min( [ all | distinct ] expression )

 示例:

select MIN(銷售) as 銷售最少,MAX(銷售) as 銷售最多 from tb_sell --利用子查詢,查詢銷售額最少的完整資訊 select * from tb_sell where 銷售 in (select MIN(銷售from tb_sell)  

3、最大值MAX

MAX函式用於計算最大值,忽略null值。max函式可以使用於numeric、char、varchar、money、smallmoney、或datetime列,但不能用於bit列。不允許使用聚合函式和子查詢。

   語法結構

MAX ( [ all | distinct ] expression )

示例:

select max(age) from person    -- 查詢person表裡的年齡的最大值
4、求和值SUM

SUM函式用於求和,只能用於精確或近似數字型別列(bit型別除外),忽略null值,不允許使用聚合函式和子查詢。

  1、語法結構:

SUM ( [ all | distinct ] expression )

示例:

select sum(age) from person    -- 查詢person表裡的年齡的總和

5、統計項數值count(count_big)

count函式用於計算滿足條件的資料項數,返回int資料型別的值。

  1、語法結構:

count( {[[ all | distinct] expression ] | * } )

這裡的表示式是除text、image或ntext以外任何資料型別的表示式。但不允許使用聚合函式和子查詢。

  2、常見使用方法

count(*) : 返回所有的項數,包括null值和重複項。而除了count(*)外,其他任何形式的count()函式都會忽略Null行。除了Count(*)函式外,其他任何聚合函式都會忽略NULL值,也就是說,AVG()引數裡的值如果為Null則這一行會被忽略如計算平均值,這點要注意。

count(all表示式):返回非空的項數。

  count(distinct表示式):返回唯一非空的項數

  count_big的語法與count完全一樣,只不過返回值為bigint資料型別,這樣返回的數值範圍就可以大大超過count。

注意:count(欄位名),如果欄位名為NULL,則count函式不會統計。例如count(name),如果name為空,則不會統計到結果。

  示例:

---利用COUNT 函式求日銷售額大於某值的商品數
select COUNT(編號)日銷售額大於的數量 from tb_sell where 日銷售額>200
顯示結果:


---下面是幾個COUNT 函式的實用例子
--查詢幾個僱員表(tb_Employee)中資料庫中有多少條記錄
select COUNT(*) from tb_Employee
--查詢僱員表(tb_Employee)中有多少位員工住在長春市
select COUNT(*) from tb_Employee where 家庭住址 like '%長春市%'
--查詢僱員表(tb_Employee)中年齡介於20~30歲的員工有多少位
select COUNT(*) from tb_Employee where DATEDIFF(YY,出生年月,GETDATE) BETWEEN 20 AND 30
--查詢在2006 年3 月份下訂單的長春市的客戶有多少位
select  COUNT(*) as 客戶數目 from 客戶 a INNER JOIN 訂貨主檔案 b 
ON a.客戶編號=b.客戶編號
where a.地址 LIKE '%長春%' AND b.訂單日期 BETWEEN '2006-03-01' AND '2006-03-31'

6、計算標準偏差值STDEV 

語法結構:

STDEV( [all | distinct ] expression )

這裡的expression必須是一個數值表示式,不允許使用聚合函式和子查詢。表示式的值是精確或近似數值型別,但不包括bit資料型別。將忽略null值。

  標準偏差是高中的東西,忘記幹什麼用的了,用到的時候再學回來吧。

  示例:

select stdev(age) from person    -- 查詢person表裡的年齡的標準偏差

7、計算方差VAR

VAR函式用於計算指定表示式中所有值的方差。

  語法結構:

VAR( [ all | distinct ] expression )

這裡的expression表示式必須是一個數值表示式,不允許使用聚合函式和子查詢。表示式的值是精確或近似數值型別,但不包括bit資料型別,將忽略null值。

  方差也是高中學的東西,忘了。

  示例:

select var(age) from person    -- 查詢person表裡的年齡的方差

8、CHECKSUM_AGG

返回組中各值的校驗和。 將忽略 Null 值。CHECKSUM_AGG 可用於檢測表中的更改。表中行的順序不影響 CHECKSUM_AGG 的結果。此外,CHECKSUM_AGG 函式還可與 DISTINCT 關鍵字和 GROUP BY 子句一起使用。如果表示式列表中的某個值發生更改,則列表的校驗和通常也會更改。但只在極少數情況下,校驗值會保持不變。

  語法如下:

CHECKSUM_AGG ( [ ALL | DISTINCT ] expression )

引數說明:

  ALL:對所有的值進行聚合函式運算。 ALL 為預設值。

  DISTINCT :指定 CHECKSUM_AGG 返回唯一校驗值。

  expression :一個整數表示式。 不允許使用聚合函式和子查詢

SELECT CHECKSUM_AGG(Account_Age) FROM AccountGOUPDATEAccount SET Account_Age = 30 WHERE Account_Id = 6GOSELECT CHECKSUM_AGG(Account_Age) FROM Account

顯示結果如下:

 
 
 
可見隨著表的更改,該系統函式返回的值也變了。此函式的作用正在於此,檢測表的更改。

9、COUNT_BIG

 返回組中的項數。 COUNT_BIG 的用法與 COUNT 函式類似。 兩個函式唯一的差別是它們的返回值。 COUNT_BIG 始終返回 bigint 資料型別值。 COUNT 始終返回 int 資料型別值。

10、GROUP BY

---分組統計
--統計學生的總成績並排序
select stu_id as 學生編號 ,name as 學生姓名 , SUM(語文+英語+數學+代數) as 總分from tb_stuAchievement
GROUP BY stu_id ,name
ORDER BY 總分 DESC 

執行結果:

11、CUBE彙總資料

CUBE 運算子生成的結果集是多維資料集。多維資料集是事實資料的擴充套件,事實資料即記錄個別事件的資料。擴充套件建立在使用者打算分析的列上。這些列被稱為維。多維資料集是一個結果集,其中包含了各維度的所有可能組合的交叉表格。

CUBE 運算子在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包含維度列和聚合函式表示式。GROUP BY 應指定維度列和關鍵字 WITH CUBE。結果集將包含維度列中各值的所有可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。