ใช้ 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() จะเอาค่าสูงสุด