Trong SQL Server (Transact-SQL), mệnh đề PIVOT cho phép lập bảng chéo để chuyển dữ liệu từ bảng này sang bảng khác, tức là lấy kết quả tổng hợp và chuyển từ dòng này sang cột khác.
Ví dụ tính tổng rồi chuyển các hàng thành cột trong bảng dữ liệu
Cú pháp mệnh đề PIVOT
SELECT cot_dautien AS ,
[giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n]
FROM
() AS
PIVOT
(
ham_tong ()
FOR
IN ([giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n])
) AS n>;
) AS n>;
Tên biến hoặc giá trị biến
cot_dautien
Cột hoặc biểu thức sẽ trở thành cột đầu tiên trong bảng mới sau khi chuyển đổi.
bidanh_cot_dautien
Tên của cột đầu tiên trong bảng mới sau khi chuyển.
giatri_chuyen1, giatri_chuyen2 ,. giatri_chuyen_n
Danh sách các giá trị cần chuyển.
bang_nguon
Câu lệnh SELECT đưa dữ liệu nguồn (dữ liệu ban đầu) vào bảng mới.
bidanh_bang_nguon
Bí danh của bang_nguon
ham_tong
Các hàm tính tổng như SUM, COUNT, MIN, MAX hoặc AVG.
cot_tong
Cột hoặc biểu thức được sử dụng với ham_tong.
cot_chuyen
Cột chứa giá trị được chuyển.
bidanh_bang_chuyen
Bí danh của bảng sau khi chuyển.
Mệnh đề PIVOT có thể được sử dụng trong các phiên bản sau của SQL Server:SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008 và SQL Server 2005.
Để làm theo các bước trong hướng dẫn, hãy xem phần DDL để tạo bảng và DML để tạo dữ liệu ở cuối bài viết này, sau đó thử chạy trên cơ sở dữ liệu của riêng bạn.
Ví dụ với mệnh đề PIVOT
Chúng ta có bảng với dữ liệu như hình dưới đây.
so_nhan_en_production id_phong 12009 Nguyen Huong 54000 45 34974 Pham Hoa 80000 45 34987 Phan Lan 42000 45 45001 Tran Hua 57500 30 75623 Vu Hong 65000 30Chạy lệnh SQL dưới đây để tạo truy vấn chéo với điều khoản PIVOT.
SELECT 'TongLuong' AS TongLuongTheoPhong,
[30], [45]
FROM
(SELECT id_phong, luong
FROM nhanvien) AS BangNguon
PIVOT
(
SUM(luong)
FOR id_phong IN ([30], [45])
) AS BangChuyen;
Kết quả trả về sẽ giống như sau.
TongLuongTheoPhong 30 45 TongLuong 122500 176000Ví dụ trên tạo một bảng sau khi dữ liệu được chuyển hết, cho biết tổng lương của phòng có ID là 30 và của phòng có ID là 45. Kết quả là trên một hàng có 2 cột, mỗi cột là 1 phòng.
Chỉ định cột trong bảng mới của truy vấn chéo
Đầu tiên cần xác định trường thông tin muốn đưa vào bảng chuyển. Trong ví dụ này, TongLuong là cột đầu tiên, sau đó là 2 cột id_phong 30 và id_phong 45.
SELECT 'TongLuong' AS TongLuongTheoPhong,
[30], [
45]
Xác định dữ liệu trong bảng nguồn
Tiếp theo là câu lệnh SELECT sẽ trả về dữ liệu nguồn cho bảng mới.
Trong ví dụ này, nó là id_phong và từ bảng.
(SELECT id_phong, luong
FROM nhanvien) AS Ba
ngNguon
Cần chỉ định bí danh cho truy vấn nguồn, trong ví dụ này là BangNguon.
Xác định hàm tính tổng
Các hàm có thể được sử dụng trong các truy vấn chéo bao gồm SUM, COUNT, MIN, MAX và AVG. Trong ví dụ này, hàm tổng SUM.
PIVOT
(SUM(luong)
Xác định giá trị sẽ được chuyển
Cuối cùng, giá trị cần được chuyển để bao gồm kết quả. Đây sẽ là tiêu đề cột trong truy vấn chéo.
Trong ví dụ này, chúng ta chỉ cần trả về id_folder 30 và 45. Các giá trị này sẽ là tên cột trong bảng mới. Hãy nhớ rằng các giá trị này là danh sách các giá trị giới hạn của id_phong và không nhất thiết phải chứa tất cả các giá trị.
FOR id_phong IN ([30], [45])
DDL / DML để làm ví dụ
Nếu bạn có cơ sở dữ liệu và muốn thử các ví dụ trong sách hướng dẫn PIVOT ở trên, bạn sẽ cần DDL / DML.
DDL - Ngôn ngữ Định nghĩa Dữ liệu là các lệnh tạo bảng (CREATE TABLE) để sử dụng trong ví dụ mệnh đề PIVOT.
CREATE TABLE phong
( id_phong INT NOT NULL,
ten_phong VARCHAR(50) NOT NULL,
CONSTRAINT pk_phong PRIMARY KEY (id_phong)
) ;
CREATE TABLE nhanvien
( so_nhanvien INT NOT NULL,
ho VARCHAR(50) NOT NULL,
ten VARCHAR(50) NOT NULL,
luong INT,
id_phong INT,
CONSTRAINT pk_nhanvien PRIMARY KEY (so_nhanvien)
) ;
DML - Ngôn ngữ thao tác dữ liệu là các câu lệnh INSERT để tạo dữ liệu cần thiết cho bảng.
INSERTINTO phong
(id_phong, ten_phong)
VALUES
(30, 'Ketoan
');
INSERT INTOphong
(id_phong, ten_phong)
VALUES
(45, 'Banhang');
INSERT INTOnhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(12009, 'Nguye
n', 'Huong', 54000, 45);
INSERT INTOnhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(34974, 'Pham',
'Flowers', 80000, 45);
INSERT INTOanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(34987, 'Phan', 'La
n', 42000, 45);
INSERTINTO nhanvien
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
45001, 'Tr
an', 'Hue', 57500, 30);
INSERT INTO home
(so_nhanvien, ho, ten, luong, id_phong)
VALUES
(75623, 'Vu', 'Hong'
, 65000, 30);