Kiểu chuyển đổi dữ liệu này được gọi là PIVOT. MySQL không có hàm pivot nhưng bạn có thể sử dụng hàm tổng hợp với CASE
biểu thức để nhận kết quả.
Nếu tên của clients
được biết trước, sau đó bạn có thể viết mã cố định cho truy vấn:
select s.playdate,
sum(case when clname = 'Chris' then score end) Chris,
sum(case when clname = 'Gale' then score end) Gale,
sum(case when clname = 'Donna' then score end) Donna
from clients c
inner join scores s
on c.clid = s.clid
group by s.playdate;
Xem SQL Fiddle với Demo .
Nếu bạn có một số lượng khách hàng không xác định hoặc bạn sẽ thêm các ứng dụng khách mới mà bạn muốn đưa vào mà không cần phải thay đổi mã, thì bạn có thể 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 clName = ''',
clName,
''' THEN score else ''-'' END) AS `',
clName, '`'
)
) INTO @sql
FROM clients;
SET @sql
= CONCAT('SELECT s.playdate, ', @sql, '
from clients c
inner join scores s
on c.clid = s.clid
group by s.playdate');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Xem SQL Fiddle với Demo . Cả hai truy vấn sẽ cho cùng một kết quả.