PIVOT ใน SQL Server คืออะไร?
คำสั่ง PIVOT ใน SQL Server (Transact-SQL) ใช้สำหรับ Cross-tabulation คือการหมุนข้อมูลจากแถวเป็นคอลัมน์ พร้อมคำนวณค่ารวม (SUM, COUNT, AVG ฯลฯ)

ตัวอย่าง: คำนวณผลรวมเงินเดือนแล้วนำแผนก (id_phong) ไปเป็นหัวคอลัมน์
รูปแบบคำสั่ง (Syntax)
SELECT first_column_alias,
[pivot_value1], [pivot_value2], ... [pivot_value_n]
FROM
(SELECT source_columns FROM source_table) AS source_alias
PIVOT
(
aggregate_function(value_column)
FOR pivot_column IN ([pivot_value1], [pivot_value2], ... [pivot_value_n])
) AS pivot_alias;
คำอธิบายพารามิเตอร์
| พารามิเตอร์ | คำอธิบาย |
|---|---|
first_column | คอลัมน์แรกในตารางผลลัพธ์ (มักเป็นชื่อกลุ่ม เช่น 'TongLuong') |
pivot_value1...n | รายการค่าที่จะหมุนเป็นหัวคอลัมน์ (ต้องเป็นค่าที่แน่นอน) |
source_table | คำสั่ง SELECT ดึงข้อมูลต้นทาง |
aggregate_function | ฟังก์ชันรวม: SUM, COUNT, MIN, MAX, AVG |
value_column | คอลัมน์ที่นำไปคำนวณกับฟังก์ชันรวม |
pivot_column | คอลัมน์ที่มีค่าใช้เป็นหัวคอลัมน์ใหม่ |
รองรับ: SQL Server 2005 ถึง 2014 และรุ่นใหม่กว่า
ตัวอย่างสมบูรณ์
ข้อมูลต้นทาง (nhanvien):
| so_nhanvien | ho | ten | luong | 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 | 30 |
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;
ผลลัพธ์:
| TongLuongTheoPhong | 30 | 45 |
|---|---|---|
| TongLuong | 122500 | 176000 |
ขั้นตอนสร้าง PIVOT
- กำหนดคอลัมน์ผลลัพธ์: คอลัมน์แรก + ค่าที่จะหมุน (เช่น
[30], [45]) - กำหนดข้อมูลต้นทาง: SELECT คอลัมน์ที่ต้องการ (id_phong, luong) + alias (BangNguon)
- เลือกฟังก์ชันรวม: SUM, COUNT, MIN, MAX, AVG (ตัวอย่างใช้ SUM)
- ระบุค่าที่จะหมุน:
FOR id_phong IN ([30], [45])— ต้องเป็นค่าที่แน่นอน ไม่จำเป็นต้องครอบคลุมทุกค่า
DDL / DML สำหรับทดลอง
CREATE TABLE
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)
);
INSERT DATA
INSERT INTO phong (id_phong, ten_phong) VALUES (30, 'Ketoan');
INSERT INTO phong (id_phong, ten_phong) VALUES (45, 'Banhang');
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (12009, 'Nguyen', 'Huong', 54000, 45);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (34974, 'Pham', 'Hoa', 80000, 45);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (34987, 'Phan', 'Lan', 42000, 45);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (45001, 'Tran', 'Hua', 57500, 30);
INSERT INTO nhanvien (so_nhanvien, ho, ten, luong, id_phong) VALUES (75623, 'Vu', 'Hong', 65000, 30);