Thứ Tư, 27 tháng 5, 2015

SQL - Bài 11: GROUP BY

Trong SQL Server chúng ta có rất nhiều chức năng tổng hợp. Ví dụ như
1. Count()
2. Sum()
3. avg()
4. Min()
5. Max()

Mệnh đề GROUP by được sử dụng để 
lựa chọn một số hàng trong một tập hợp  mà giá trị của nó thuộc về một hoặc nhiều cột hoặc thỏa mãn một  biểu thức nào đó. Nó luôn được sử dụng với một hoặc nhiều hơn các hàm tổng hợp trên kia.


Tôi muốn tạo một truy vấn, mà nó sẽ ra tổng hợp lương của mỗi thành phố. Bảng xuất ra giống như ở dưới

Câu lệnh truy vấn để lấy thông lương của các thành phố:
Chúng ta sử dung hàm tổng hợp SUM() cho cột Salary, và gom lại bằng cột thành phố. Nó hiệu quả thêm ở chổ cho biết tổng lương của người lao động trong cùng một thành phố. 
Select City, SUM(Salary) as TotalSalary 
from tblEmployee
Group by City

Lưu ý: Nếu bạn bỏ qua không nhóm bằng mệnh đề group by và cố gắng thực thi truy vấn nó sẽ hiện thông báo lỗi như sau -Column 'tblEmployee.City' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Bây giờ, tôi muốn một truy vấn, nó tính tổng lương bằng City và gender. Kết quả thực thi như sau

Truy vấn lấy tổng các lương bởi city và gender. Nó có thể gom nhóm bằng nhiều cột. Trong truy vấn này, chúng ta gom nhóm thuộc tính đầu tiền là city và sau đó là gender
Select City, Gender, SUM(Salary) as TotalSalary
from tblEmployee
group by City, Gender

Bây giờ, tôi muốn một truy vấn trả về tổng các lương và tổng số các nhân viên theo thành phố và theo giới tính. Kết quả xuất ra như sau:


Truy vấn này sẽ trả về tổng lương và tổng số nhân viên theo City và gender. Sự khác biệt duy nhất ở đây là chúng ta sử dụng hàm tổng hợp Coutn()Select City, Gender, SUM(Salary) as TotalSalary,
COUNT(ID) as TotalEmployees

from tblEmployee
group by City, Gender

Lọc các giá trị:
Mệnh đề WHERE được sử dụng để lọc các hàng trước khi tổng hợp, trong khi mệnh đề HAVING là sử dụng để lọc nhưng lọc nhưng là lọc các điều kiện trên nhóm

SELECT <danh sách các cột>
FROM <danh sách các bảng>
WHERE <điều kiện>
GROUP BY <danh sách các cột gom nhóm>
HAVING <điều kiện trên nhóm>

Lọc các hàng sử dụng mệnh đề WHERE, trước khi tổng hợp theo nhóm:Select City, SUM(Salary) as TotalSalary
from tblEmployee
Where City = 'London'
group by City

Lọc các nhóm sử dụng mệnh đề HAVING, sau khi tất cả đã được tổng hợp:Select City, SUM(Salary) as TotalSalary
from tblEmployee
group by City
Having City = 'London'

"From a performance standpoint, you cannot say that one method is less efficient than the other. Sql server optimizer analyzes each statement and selects an efficient way of executing it. As a best practice, use the syntax that clearly describes the desired result. Try to eliminate rows that 
you wouldn't need, as early as possible"


Cũng có thể kết hợp WHERE và HAVINGSelect City, SUM(Salary) as TotalSalary
from tblEmployee
Where Gender = 'Male'
group by City
Having City = 'London'

Sự khác biệt giữa 2 mệnh đề WHERE và HAVING:
1. WHERE clause can be used with - Select, Insert, and Update statements, where as HAVING clause can only be used with the Select statement.
2. WHERE filters rows before aggregation (GROUPING), where as, HAVING filters groups, after the aggregations are performed.
3. Aggregate functions cannot be used in the WHERE clause, unless it is in a sub query contained in a HAVING clause, whereas, aggregate functions can be used in Having clause.












Không có nhận xét nào:

Đăng nhận xét