Những gì bạn cần là một truy vấn Pivot. Vì MySQL không có câu lệnh cho điều đó, bạn sẽ cần phải viết nó "bằng tay" (chính xác hơn là tạo một biểu thức SQL động):
Vì vậy, nó có thể giống như thế này:
-- First you need to build the column list.
-- The "CASE ... END" expression will filter the data for each column
-- I use "max()" as an example; use whatever aggregate function you need.
select
group_concat(distinct
concat(
'max(case when del_ProductID = ', del_productID, ' then del_id end) ',
'as `del_productID-', del_productID, '` '
)
)
into @sql
from example;
-- Now build the full SELECT statement
set @sql = concat('SELECT del_date, ', @sql, ' from example group by del_date');
-- OPTIONAL: Check the SELECT statement you've just built
select @sql;
-- Prepare a statement using the SELECT statement built above
prepare stmt from @sql;
execute stmt;
-- When you are done, be sure to dealocate the prepared statement
deallocate prepare stmt;
Vui lòng xem ví dụ này trong SQL fiddle .
Lời giải thích
Bạn có thể nói "anh bạn, cái này trông khá phức tạp!" ... nhưng nó không phức tạp chút nào (chỉ tốn công thôi). Vậy, giải pháp trên hoạt động như thế nào?
Bước đầu tiên là xây dựng danh sách cột và một biểu thức để điền vào nó. group_concat()
hàm sẽ nhận các giá trị hàng (hoặc biểu thức) và nối chúng, phân tách chúng bằng dấu phẩy. Bạn cần một hàm tổng hợp để hiển thị các giá trị trong kết quả của bảng tổng hợp. Tôi đã chọn max()
làm ví dụ, nhưng bạn có thể sử dụng sum()
, average()
hoặc bất kỳ chức năng tổng hợp nào khác.
Đối với trường hợp case ... end
bên trong hàm tổng hợp, bạn cần mỗi cột của bảng tổng hợp khớp với giá trị của del_productID
, vì vậy, ví dụ:case when del_ProductID = 1 then del_id end
sẽ trả về giá trị của del_id
chỉ khi del_ProductID
là 1 (sẽ trả về null
trong bất kỳ trường hợp nào khác, bạn có thể thêm else 0
nếu bạn muốn trả về số 0 chẳng hạn).
select ... into
sẽ lưu trữ kết quả của biểu thức vào một biến có tên là @sql
.
Sau khi đã tạo danh sách cột, bạn cần viết phần còn lại của select
câu lệnh ... đã xong với concat()
chức năng.
Đối với phần còn lại, nó khá đơn giản:@sql
là một chuỗi, vì vậy nếu bạn muốn thực thi nó, bạn cần tạo một câu lệnh chuẩn bị bằng cách sử dụng giá trị của nó (là một select
câu lệnh) và thực thi nó.