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

การทำ Pivot Table ใน MySQL: ใช้ค่า Column เป็นชื่อ Column ใหม่

ใช้ CASE statement ร่วมกับ MAX() และ GROUP BY เพื่อสร้าง Pivot Table (แปลงแถวเป็นคอลัมน์)

ไวยากรณ์

SELECT yourIdColumnName,
    MAX(CASE WHEN yourColumnName1 = 'value1' THEN yourColumnName2 ELSE NULL END) AS 'value1',
    MAX(CASE WHEN yourColumnName1 = 'value2' THEN yourColumnName2 ELSE NULL END) AS 'value2',
    ...
FROM yourTableName
GROUP BY yourIdColumnName
ORDER BY yourIdColumnName;

ตัวอย่างการใช้งาน

สร้างตาราง:

mysql> create table valueAsColumn (
    -> UserId int,
    -> UserColumn1 varchar(10),
    -> UserColumn2 varchar(10)
    -> );
Query OK, 0 rows affected (0.75 sec)

เพิ่มข้อมูล:

mysql> insert into valueAsColumn values(0,'John','A+'),(0,'Carol','B'),(0,'Sam','C');
mysql> insert into valueAsColumn values(1,'John','D'),(1,'Carol','A'),(1,'Carol','C');

ข้อมูลเดิม (Long format):

+--------+-------------+-------------+
| UserId | UserColumn1 | UserColumn2 |
+--------+-------------+-------------+
|      0 | John        | A+          |
|      0 | Carol       | B           |
|      0 | Sam         | C           |
|      1 | John        | D           |
|      1 | Carol       | A           |
|      1 | Carol       | C           |
+--------+-------------+-------------+

Pivot: ทำให้ UserColumn1 กลายเป็นชื่อคอลัมน์:

mysql> SELECT UserId,
    -> MAX(CASE WHEN UserColumn1='John' THEN UserColumn2 ELSE NULL END) AS 'John',
    -> MAX(CASE WHEN UserColumn1='Carol' THEN UserColumn2 ELSE NULL END) AS 'Carol',
    -> MAX(CASE WHEN UserColumn1='Sam' THEN UserColumn2 ELSE NULL END) AS 'Sam'
    -> FROM valueAsColumn GROUP BY UserId ORDER BY UserId;

ผลลัพธ์ (Wide format):

+--------+------+-------+------+
| UserId | John | Carol | Sam  |
+--------+------+-------+------+
|      0 | A+   | B     | C    |
|      1 | D    | C     | NULL |
+--------+------+-------+------+

หมายเหตุ: ใช้ MAX() เพราะอาจมีหลายค่าต่อกลุ่ม (เช่น Carol มี 2 ค่า A และ C) MAX() จะเอาค่าสูงสุด