01/10/2018, 17:18

Hàm AVG() tính giá trị trung bình trong sql

Hàm AVG() tính giá trị trung bình của các giá trị trong một nhóm. Những giá trị null (rỗng/trống) bỏ qua, không tính. Cú pháp: AVG ([ ALL | DISTINCT ] expression) Trong đó: ALL: tính giá trị trung bình cho tất cả các giá trị có trong dữ liệu cần tính. ALL được mặc định. ...

Hàm AVG() tính giá trị trung bình của các giá trị trong một nhóm. Những giá trị null (rỗng/trống) bỏ qua, không tính.

Cú pháp:

AVG ([ALL | DISTINCT] expression)

Trong đó:

  • ALL: tính giá trị trung bình cho tất cả các giá trị có trong dữ liệu cần tính.  ALL được mặc định.
  • DISTINCT: chỉ tính trung bình trên những giá trị duy nhất, những giá trị lặp lại được tính là 1 lần.
  • expression: biểu thức tính giá trị trung bình, biểu thức phải là kiểu số (number), ngoại trừ kiểu dữ liệu bit. Những hàm tính gọp (aggregate functions) và truy vấn lồng (subqueries) không được hỗ trợ.

Giả sử bạn có bảng IS_SickBenefit lưu % các loại bảo hiểm để nhận bảo hiểm khi bạn ốm đau.

Bảng IS_SickBenefit gồm 3 cột sau:

–       Index: kiểu int, khóa chính

–       Type: kiểu nvarchar, lưu loại bảo hiểm được hưởng trợ cấp ốm đau

–       PercentBenefit: kiểu double lưu phần trăm được hưởng trợ cấp ốm đau

Giả sử, ta có bảng dữ liệu như sau:

Index Type PercentBenefit
1 Bảng thân ốm ngắn ngày 75
2 Ốm dài ngày 75
3 Dưỡng sức 25
4 Con ốm 75

Bây giờ chúng ta sẽ tính giá trị trung bình cho % bảo hiểm được nhận, ta sử dụng cả ALL và DISTINCT

-- Câu 1: Dùng ALL
SELECT  AVG(PercentBenefit) AS avgPercentage FROM IS_SickBenefit
-- => Kết quả: 62.5

-- Câu 2: Dùng DISTINCT
SELECT  AVG(DISTINCT PercentBenefit) AS avgPercentage FROM IS_SickBenefit
-- Kết quả: 50

Giải thích:

–       Câu 1: được hiểu ngầm là ALL (bạn có thể thêm từ ALL vào trước PercentBenefit trong câu truy vấn (query)), nên kết quả trung bình được tính như sau, lấy tổng của cột PercentBenefit sau đó chia cho tổng số dòng có dữ liệu khác rỗng (ở đây có 4 dòng từ dòng 1 đến dòng 4):

(75 + 75 + 25 + 75)/4 = 62.5

–       Câu 2: dùng từ khóa DISTINCT, nên những giá trị lập lại chỉ được tính một lần. Trong bản dữ liệu trên 75% xuất hiện 3 lần, nhưng chỉ được tính một lần, cho nên tổng số dòng sẽ là 2 (1 của 75%, 1 của 25%), kết quả trung bình được tính như sau:

(75 + 25)/2 = 50

Chúc mọi người thành công! :-P


0