Toán tử xoay trong SQL Server chuyển đổi từng hàng trong tập kết quả tổng hợp thành các cột tương ứng trong tập kết quả. Toán tử xoay đặc biệt hữu ích trong việc viết các truy vấn lập bảng chéo.
Hãy xem cách nó hoạt động trong thực tế.
Chuẩn bị dữ liệu
Đầu tiên, hãy tạo một số dữ liệu giả mà sau đó chúng ta có thể sử dụng để triển khai toán tử trục.
CREATE DATABASE schooldb
CREATE TABLE student
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
DOB datetime NOT NULL,
total_score INT NOT NULL,
city VARCHAR(50) NOT NULL
)
INSERT INTO student
VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500, 'London'),
(2, 'Jon', 'Male', '02-FEB-1974', 545, 'Manchester'),
(3, 'Sara', 'Female', '07-MAR-1988', 600, 'Leeds'),
(4, 'Laura', 'Female', '22-DEC-1981', 400, 'Liverpool'),
(5, 'Alan', 'Male', '29-JUL-1993', 500, 'London'),
(6, 'Kate', 'Female', '03-JAN-1985', 500, 'Liverpool'),
(7, 'Joseph', 'Male', '09-APR-1982', 643, 'London'),
(8, 'Mice', 'Male', '16-AUG-1974', 543, 'Liverpool'),
(9, 'Wise', 'Male', '11-NOV-1987', 499, 'Manchester'),
(10, 'Elis', 'Female', '28-OCT-1990', 400, 'Leeds');
Nhà điều hành Pivot hoạt động như thế nào?
Cách tiêu chuẩn để nhóm dữ liệu SQL là sử dụng mệnh đề Group By. Hãy tạo một truy vấn tính giá trị trung bình của các giá trị trong cột total_score của bảng sinh viên, được nhóm theo thành phố.
USE schooldb
SELECT
city,
AVG(total_score) as Avg_Score
FROM
student
GROUP BY
city
Điều này cho kết quả sau:
[id bảng =25 /]
Điều gì sẽ xảy ra nếu chúng ta muốn một tập hợp kết quả trong đó tên thành phố được hiển thị trong các cột trong đó mỗi cột chứa giá trị trung bình của tổng điểm của học sinh thuộc thành phố đó? Một cái gì đó như thế này:
[id bảng =26 /]
Đây là lúc toán tử trục có ích.
Chọn Dữ liệu Cơ sở
Bước đầu tiên khi sử dụng toán tử trục là chọn dữ liệu cơ sở mà toán tử trục sẽ dựa trên. Chúng tôi muốn nhóm dữ liệu của mình theo thành phố và tìm điểm trung bình của tổng điểm của các sinh viên thuộc thành phố đó. Do đó, chúng ta cần viết một câu lệnh SELECT đơn giản để chọn thành phố và tổng điểm.
SELECT
city,
total_score
FROM
student
Tạo tập dữ liệu tạm thời
Bây giờ, lý tưởng là chúng tôi có thể áp dụng trực tiếp toán tử xoay trên dữ liệu cơ sở mà chúng tôi đã tạo trong phần trước nhưng rất tiếc, chúng tôi không thể. Để toán tử pivot hoạt động, chúng ta phải tạo một biểu thức có giá trị bảng mà chúng ta có thể áp dụng toán tử pivot. Chúng tôi có nhiều sự lựa chọn ở đây; chúng tôi có thể sử dụng các bảng dẫn xuất, các biểu thức bảng chung (CTE) hoặc thậm chí chúng tôi có thể tạo các bảng tạm thời.
Đối với ví dụ này, chúng tôi sẽ sử dụng một bảng dẫn xuất nhanh, đơn giản. Để làm điều đó với câu lệnh select cơ bản mà chúng tôi đã tạo trong phần trước, chúng tôi đặt nó trong một tập hợp các dấu ngoặc đơn và sau đó áp dụng một bí danh cho nó. Cuối cùng, chúng tôi chọn mọi thứ từ bảng dẫn xuất đó.
SELECT * FROM
(SELECT
city,
total_score
FROM
student
)
AS StudentTable
Áp dụng Toán tử Pivot
Bây giờ chúng tôi đã chuẩn bị dữ liệu cơ sở của mình và đã tạo một bảng dẫn xuất, chúng tôi sẽ áp dụng toán tử trục cho nó.
Để thực hiện việc này, hãy chèn “PIVOT” vào cuối bảng dẫn xuất, theo sau là một bộ dấu ngoặc đơn và đặt bí danh cho bảng tổng hợp này.
Bên trong dấu ngoặc đơn, chúng ta phải chỉ định một số thông tin quan trọng.
- Chúng tôi cần chỉ định trường mà chúng tôi muốn áp dụng một hàm tổng hợp. Trong trường hợp của chúng tôi, chúng tôi muốn áp dụng hàm tổng hợp AVG trong cột “total_score”.
- Sau đó, chúng tôi phải cho biết những cột nào từ dữ liệu cơ sở mà chúng tôi đang xoay vòng dữ liệu của mình. Chúng tôi làm như vậy bằng cách viết “FOR” theo sau là tên cột là một thành phố trong ví dụ của chúng tôi.
- Bước cuối cùng hơi khó chịu. Chúng tôi phải liệt kê các giá trị từ cột thành phố mà chúng tôi muốn trở thành tiêu đề trong bảng tổng hợp của chúng tôi. Chúng tôi sử dụng toán tử IN theo sau bởi một tập hợp các dấu ngoặc đơn. Bên trong dấu ngoặc đơn, chúng tôi sử dụng danh sách được phân tách bằng dấu phẩy, nơi chúng tôi viết tên của mỗi cột bên trong dấu ngoặc vuông. Trong ví dụ của chúng tôi, chúng tôi muốn London, Leeds và Manchester làm tên tiêu đề của bảng tổng hợp và vì vậy chúng tôi viết chúng ở định dạng sau:([London], [Leeds], [Manchester]).
USE schooldb
SELECT * FROM
(SELECT
city,
total_score
FROM
student
)
AS StudentTable
PIVOT(
AVG(total_score)
FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable
Nếu bạn thực hiện truy vấn trên, kết quả sẽ như thế này:
[id bảng =27 /]
Thêm nhóm hàng trong bảng tổng hợp
Trong các phần trước, chúng ta đã biết cách chuyển nhóm hàng thành nhóm cột bằng cách sử dụng toán tử pivot. Tuy nhiên, bạn cũng có thể thêm nhóm hàng cùng với nhóm cột vào bảng tổng hợp.
Ví dụ:nếu bạn muốn tìm giá trị trung bình của cột tổng điểm của tất cả học sinh được nhóm theo thành phố cũng như theo giới tính, bạn có thể sử dụng nhóm cột và nhóm hàng kết hợp bên trong bảng tổng hợp. Ở đây, mỗi cột sẽ đại diện cho một tên thành phố và mỗi hàng sẽ đại diện cho một giới tính của sinh viên.
May mắn thay, bạn không phải viết bất kỳ tập lệnh bổ sung nào để thêm nhóm hàng vào bảng tổng hợp. Bên trong tập dữ liệu cơ sở, chỉ cần thêm tên cột mà bạn muốn thêm làm nhóm hàng vào bảng tổng hợp.
USE schooldb
SELECT * FROM
(SELECT
city,
gender,
total_score
FROM
student
)
AS StudentTable
PIVOT(
AVG(total_score)
FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable
Trong tập lệnh trên, chúng tôi chỉ cần thêm cột "giới tính" vào câu lệnh SELECT cơ sở.
Đầu ra của truy vấn trên trông giống như sau:
[id bảng =28 /]
Đây là lập bảng chéo. Ví dụ, có thể thấy từ kết quả tổng điểm trung bình của sinh viên nữ sống ở London là 500. Tương tự, tổng điểm trung bình của sinh viên nam sống ở London là 571.
Đọc thêm:
Tạo Bảng tổng hợp động với Hàm QUOTENAME