MySQL tidak memiliki fungsi UNPIVOT, tetapi Anda dapat mengubah kolom menjadi baris menggunakan UNION ALL
.
Sintaks dasarnya adalah:
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;
Dalam kasus Anda, Anda menyatakan bahwa Anda memerlukan solusi untuk kolom dinamis. Jika demikian, maka Anda perlu menggunakan pernyataan yang telah disiapkan untuk menghasilkan SQL dinamis:
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;
Lihat SQL Fiddle dengan Demo