MySQL không có hàm UNPIVOT, nhưng bạn có thể chuyển đổi các cột của mình thành hàng bằng cách sử dụng UNION ALL
.
Cú pháp cơ bản là:
select id, word, qty
from
(
select id, 'abc' word, abc qty
from yt
where abc > 0
union all
select id, 'brt', brt
from yt
where brt > 0
) d
order by id;
Trong trường hợp của bạn, bạn nói rằng bạn cần một giải pháp cho các cột động. Nếu đúng như vậy, 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(
'select id, ''',
c.column_name,
''' as word, ',
c.column_name,
' as qty
from yt
where ',
c.column_name,
' > 0'
) SEPARATOR ' UNION ALL '
) INTO @sql
FROM information_schema.columns c
where c.table_name = 'yt'
and c.column_name not in ('id')
order by c.ordinal_position;
SET @sql
= CONCAT('select id, word, qty
from
(', @sql, ') x order by id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;