Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Hiểu các câu lệnh PIVOT, UNPIVOT và Đảo ngược PIVOT

Câu lệnh PIVOT được sử dụng để chuyển đổi các hàng trong bảng thành cột, trong khi toán tử UNPIVOT chuyển đổi các cột trở lại thành hàng. Đảo ngược câu lệnh PIVOT đề cập đến quá trình áp dụng toán tử UNPIVOT cho tập dữ liệu đã được PIVOTED để truy xuất tập dữ liệu ban đầu.

Trong bài viết này, chúng tôi sẽ nghiên cứu ba khái niệm này trên các ví dụ khác nhau.

Nhà điều hành PIVOT

Như đã đề cập trước đó, toán tử PIVOT chuyển đổi các hàng trong bảng thành cột. Ví dụ:nếu bạn có một bảng giống như sau:

và xoay nó theo cột thứ ba, kết quả sẽ như sau:

Trong bảng ban đầu, chúng tôi có hai giá trị duy nhất cho các cột Khóa học - Tiếng Anh và Lịch sử. Trong bảng xoay vòng, các giá trị duy nhất này đã được chuyển đổi thành cột. Bạn có thể thấy rằng các giá trị điểm cho mỗi cột mới vẫn không thay đổi. Ví dụ, trong bảng gốc, một học sinh, Sally, đã đạt 95 điểm môn tiếng Anh, không giống như các giá trị trong bảng xoay.

Luôn đảm bảo rằng bạn tạo một bản sao lưu an toàn trước khi thực hiện bất kỳ điều chỉnh nào đối với cơ sở dữ liệu trực tiếp.

Hãy xem ví dụ này về việc sử dụng toán tử PIVOT trong SQL Server.

CREATE DATABASE School
GO

USE School
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Course VARCHAR (50),
	Score INT
)
GO

INSERT INTO Students VALUES ('Sally', 'English', 95 )
INSERT INTO Students VALUES ('Sally', 'History', 82)
INSERT INTO Students VALUES ('Edward', 'English', 45)
INSERT INTO Students VALUES ('Edward', 'History', 78)

Tập lệnh trên tạo cơ sở dữ liệu Trường. Trong cơ sở dữ liệu, chúng tôi tạo bảng Sinh viên với bốn cột, chẳng hạn như Id, Tên sinh viên, Khóa học và Điểm. Cuối cùng, chúng tôi thêm bốn bản ghi giả vào bảng Học sinh.

Bây giờ, nếu bạn sử dụng câu lệnh SELECT để truy xuất tất cả các bản ghi, bạn sẽ thấy như sau:

Hãy CHIA SẺ bảng này theo cột Khóa học. Để thực hiện việc này, hãy thực thi tập lệnh sau:

SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot

Hãy xem điều gì đang xảy ra trong kịch bản. Trong dòng đầu tiên, chúng tôi sử dụng câu lệnh SELECT để xác định các cột mà chúng tôi muốn thêm vào bảng xoay vòng. Hai cột đầu tiên là Tên sinh viên và Điểm. Dữ liệu cho hai cột này sẽ đến trực tiếp từ bảng Học sinh. Cột thứ ba là Khóa học. Chúng tôi muốn PIVOT bảng của mình theo cột Khóa học, do đó, cột Khóa học sẽ được chia thành số cột bằng các giá trị được chỉ định bởi toán tử PIVOT cho cột Khóa học.

Cú pháp cho toán tử PIVOT rất đơn giản. Đầu tiên, bạn phải áp dụng một hàm tổng hợp cho cột mà các giá trị mà bạn muốn hiển thị trong các cột được xoay vòng. Trong trường hợp của chúng tôi, chúng tôi muốn hiển thị Điểm trong các cột xoay quanh - Tiếng Anh và Lịch sử. Cuối cùng, chúng tôi sử dụng câu lệnh FOR để chỉ định cột pivot và các giá trị duy nhất trong đó. Kết quả như sau:

Nhà điều hành UNPIVOT

Toán tử UNPIVOT được sử dụng để chuyển đổi các cột trong bảng thành các hàng. Ví dụ:nếu bạn có một bảng giống như sau:

Toán tử UNPIVOT sẽ trả về các kết quả sau:

Các cột của bảng gốc đã được chuyển đổi thành các hàng trong bảng chưa được phân chia. Hãy sử dụng dữ liệu đó để xem cách toán tử UNPIVOT hoạt động trong SQL.

Để thực hiện việc này, hãy thực thi tập lệnh sau:

CREATE DATABASE School2
GO

USE School2
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Math INT,
	English INT,
	History INT,
	Science INT
)
GO

INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 )
INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)

Nếu bạn chọn dữ liệu từ bảng Sinh viên của cơ sở dữ liệu School2, bạn sẽ thấy các kết quả sau:

Để áp dụng toán tử UNPIVOT cho bảng này, hãy chạy truy vấn sau:

SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
	Score
	FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot

Cú pháp của toán tử UNPIVOT tương tự như toán tử PIVOT. Trong câu lệnh SELECT, bạn cần chỉ định các cột bạn muốn thêm vào bảng đầu ra. Trong câu lệnh UNPIVOT, bạn sẽ chỉ định hai cột:

  1. Cột đầu tiên chứa các giá trị từ các hàng của cột xoay vòng (trong trường hợp này là Điểm).
  2. Cột thứ hai bao gồm tên của các cột xoay quanh, tức là Toán, Tiếng Anh, Lịch sử và Khoa học.

Bảng đầu ra sẽ giống như sau:

Đảo ngược PIVOT

Đảo ngược toán tử PIVOT đề cập đến quá trình áp dụng toán tử UNPIVOT vào bảng xoay vòng để quay lại bảng ban đầu.

Đảo ngược Bảng xoay vòng không tổng hợp

Chỉ có thể đảo ngược toán tử PIVOT nếu bảng xoay vòng không chứa dữ liệu tổng hợp.

Hãy xem bảng chúng tôi đã sử dụng trong phần PIVOT của bài viết này.

Bạn có thể thấy rằng không có hàng lặp lại. Nói cách khác, chúng ta có thể nói rằng mỗi học sinh chỉ có một bản ghi cho mỗi khóa học. Ví dụ:Sally chỉ có một kỷ lục về điểm số của cô ấy trong khóa học tiếng Anh.

Khi chúng tôi áp dụng toán tử PIVOT cho bảng trên, chúng tôi nhận được kết quả sau:

Bây giờ, chúng ta sẽ áp dụng toán tử UNPIVOT cho kết quả này và xem liệu chúng ta có thể quay lại bảng ban đầu hay không. Để thực hiện việc này, hãy thực thi tập lệnh sau:

Lưu ý:

Chúng tôi có thể thực hiện truy vấn này trên cơ sở dữ liệu Trường học mà chúng tôi đã tạo trong phần toán tử PIVOT.

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Ở đây chúng tôi sử dụng một truy vấn con để áp dụng toán tử UNPIVOT cho dữ liệu được xoay vòng. Truy vấn bên trong sử dụng toán tử PIVOT, trong khi truy vấn bên ngoài sử dụng toán tử UNPIVOT. Ở đầu ra, bạn sẽ thấy bảng Sinh viên ban đầu.

Đảo ngược Bảng xoay vòng tổng hợp

Chúng tôi đã nói trước đó rằng chỉ có thể đảo ngược toán tử PIVOT không chứa dữ liệu tổng hợp. Hãy thử đảo ngược câu lệnh PIVOT có chứa dữ liệu tổng hợp.

Thêm một bản ghi khác vào bảng Học sinh của cơ sở dữ liệu Trường học mà chúng tôi đã tạo trong phần đầu tiên của bài viết này. Để thực hiện việc này, hãy chạy truy vấn sau:

INSERT INTO Students VALUES ('Edward', 'History', 78)

Bây giờ, nếu bạn chọn tất cả các bản ghi từ bảng Sinh viên, bạn sẽ nhận được kết quả sau:

Chúng tôi có thể thấy rằng chúng tôi có một hồ sơ trùng lặp về điểm số của Edward trong môn Lịch sử.

Bây giờ, hãy áp dụng toán tử PIVOT cho bảng này.

SELECT Id, StudentName, English, History
FROM Students
PIVOT
(
	SUM (Score)
	FOR Course in (English, History)
) AS Schoolpivot

Từ kết quả đầu ra, bạn có thể thấy rằng hàm SUM trong toán tử PIVOT đã thêm hai điểm vào môn Lịch sử do Edward thực hiện. Nếu bạn cố gắng đảo ngược trục của bảng này (tức là áp dụng toán tử UNPIVOT), bạn sẽ không nhận được bảng ban đầu. Nó sẽ trả về bốn bản ghi thay vì năm bản gốc. Cột Lịch sử cho học sinh Edward sẽ chứa kết quả tổng hợp thay vì kết quả riêng lẻ.

Để xem điều này, hãy thực thi tập lệnh sau:

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Bảng đầu ra sẽ giống như sau:

Tài liệu tham khảo:

  • Microsoft:Sử dụng PIVOT và UNPIVOT
  • Codingsight:Sử dụng PIVOT trong SQL
  • YouTube:Đảo ngược video PIVOT

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Toán tử SQL Equals (=) cho người mới bắt đầu

  2. Gửi dữ liệu SentryOne tới Máy tính DTU của Cơ sở dữ liệu Azure SQL

  3. Đổi tên các chỉ mục bằng thủ tục sp_rename

  4. Cách tự động hóa các tác vụ bảo trì cơ sở dữ liệu SQL bằng SQLCMD

  5. Những gì tôi muốn thấy trong Amazon EC2 cho Quản lý cơ sở dữ liệu