Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> SQL Server

คำสั่ง PIVOT ใน SQL Server

PIVOT ใน SQL Server คืออะไร?

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

คำสั่ง PIVOT ใน SQL Server

ตัวอย่าง: คำนวณผลรวมเงินเดือนแล้วนำแผนก (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_nhanvienhotenluongid_phong
12009NguyenHuong5400045
34974PhamHoa8000045
34987PhanLan4200045
45001TranHua5750030
75623VuHong6500030
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;

ผลลัพธ์:

TongLuongTheoPhong3045
TongLuong122500176000

ขั้นตอนสร้าง PIVOT

  1. กำหนดคอลัมน์ผลลัพธ์: คอลัมน์แรก + ค่าที่จะหมุน (เช่น [30], [45])
  2. กำหนดข้อมูลต้นทาง: SELECT คอลัมน์ที่ต้องการ (id_phong, luong) + alias (BangNguon)
  3. เลือกฟังก์ชันรวม: SUM, COUNT, MIN, MAX, AVG (ตัวอย่างใช้ SUM)
  4. ระบุค่าที่จะหมุน: 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);