Loại chuyển đổi dữ liệu này được gọi là pivot . MySQL không có hàm pivot, vì vậy bạn sẽ muốn chuyển đổi dữ liệu bằng cách sử dụng hàm tổng hợp với CASE
biểu thức.
Nếu bạn biết trước các giá trị cần chuyển đổi, thì bạn có thể mã hóa chúng tương tự như sau:
select studentid,
sum(case when subject = 'Java' then mark else 0 end) Java,
sum(case when subject = 'C#' then mark else 0 end) `C#`,
sum(case when subject = 'JavaScript' then mark else 0 end) JavaScript
from yourtable
group by studentid
Xem SQL Fiddle with Demo .
Nếu các giá trị của chủ đề không xác định hoặc linh hoạt, thì bạn có thể muốn sử dụng một câu lệnh đã chuẩn bị để tạo sql động:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when subject = ''',
subject,
''' then mark else 0 end) AS `',
subject, '`'
)
) INTO @sql
FROM yourtable;
SET @sql = CONCAT('SELECT studentid, ', @sql, '
from yourtable
group by studentid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Xem SQL Fiddle with Demo .
Kết quả cho cả hai truy vấn là:
| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
| 10 | 46 | 65 | 79 |
| 11 | 66 | 85 | 99 |