การเตรียมข้อมูล
mysql> CREATE TABLE DemoTable1869 (
Id INT, Subject VARCHAR(20), Name VARCHAR(20)
);
mysql> INSERT INTO DemoTable1869 VALUES
(100, 'MySQL', 'John'), (100, 'MongoDB', 'Smith'),
(101, 'MySQL', 'Chris'), (101, 'MongoDB', 'Brown');
ข้อมูลในตาราง
+------+---------+-------+
| Id | Subject | Name |
+------+---------+-------+
| 100 | MySQL | John |
| 100 | MongoDB | Smith |
| 101 | MySQL | Chris |
| 101 | MongoDB | Brown |
+------+---------+-------+
รวม Name ตาม Subject ในแต่ละ Id
mysql> SELECT Id, CONCAT(StudentFirstName, '', StudentLastName)
FROM (
SELECT Id,
MAX(CASE WHEN Subject = 'MySQL' THEN Name END) AS StudentFirstName,
MAX(CASE WHEN Subject = 'MongoDB' THEN Name END) AS StudentLastName
FROM DemoTable1869
GROUP BY Id
) tbl;
ผลลัพธ์:
+------+---------------------------------------------+
| Id | concat(StudentFirstName,'',StudentLastName) |
+------+---------------------------------------------+
| 100 | JohnSmith |
| 101 | ChrisBrown |
+------+---------------------------------------------+
การทำงานของ Conditional Aggregation
CASE WHEN Subject='MySQL' THEN Name END→ คืน Name ถ้า MySQL, ไม่งั้น NULLMAX(...)ข้าม NULL ไป → ได้ค่าที่ไม่ใช่ NULL (มีเพียง 1 ค่า)GROUP BY Idรวมเป็น 1 แถวต่อ Id- Outer Query: CONCAT รวม First + Last
วิธีอื่น: GROUP_CONCAT (MySQL 8.0+)
-- เรียงตาม Subject แล้วรวม
SELECT Id, GROUP_CONCAT(Name ORDER BY Subject SEPARATOR '')
FROM DemoTable1869
GROUP BY Id;
-- กำหนดลำดับ Subject ชัดเจน
SELECT Id, GROUP_CONCAT(Name ORDER BY FIELD(Subject, 'MySQL', 'MongoDB') SEPARATOR '')
FROM DemoTable1869 GROUP BY Id;
Pivot Table (Crosstab) Pattern
เทคนิคนี้เรียกว่า Pivot: แปลง Rows เป็น Columns
SELECT
Id,
MAX(CASE WHEN Subject = 'MySQL' THEN Name END) AS MySQL_Name,
MAX(CASE WHEN Subject = 'MongoDB' THEN Name END) AS MongoDB_Name
FROM DemoTable1869
GROUP BY Id;