Để có được kết quả này, bạn sẽ muốn xoay dữ liệu. 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.
Nếu số ngày đã biết, thì bạn có thể viết mã cố định cho truy vấn:
select client_id,
max(case when rownum = 1 then date end) Date1,
max(case when rownum = 2 then date end) Date2,
max(case when rownum = 3 then date end) Date3
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0, @prev:=null) r
order by client_id, date
) s
group by client_id
order by client_id, date
Tôi đã triển khai các biến người dùng để chỉ định số hàng cho mỗi bản ghi trong client_id
nhóm.
Nếu bạn có một số ngày không xác định, thì bạn sẽ cầ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(
'MAX(CASE WHEN rownum = ',
rownum,
' THEN date END) AS Date_',
rownum
)
) INTO @sql
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0) r
order by client_id, date
) s
order by client_id, date;
SET @sql
= CONCAT('SELECT client_id, ', @sql, '
from
(
select client_id,
date,
@row:=if(@prev=client_id, @row,0) + 1 as rownum,
@prev:=client_id
from yourtable, (SELECT @row:=0) r
order by client_id, date
) s
group by client_id
order by client_id, date');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Xem SQL Fiddle with Demo .
Cả hai đều cho kết quả:
| CLIENT_ID | DATE_1 | DATE_2 | DATE_3 |
--------------------------------------------------------------------------------------------------------------
| 1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
| 2 | February, 03 2013 00:00:00+0000 | July, 15 2013 00:00:00+0000 | (null) |