MySQL nie posiada funkcji UNPIVOT, ale możesz przekonwertować kolumny na wiersze za pomocą UNION ALL
.
Podstawowa składnia to:
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;
W Twoim przypadku stwierdzasz, że potrzebujesz rozwiązania dla kolumn dynamicznych. W takim przypadku będziesz musiał użyć przygotowanej instrukcji do wygenerowania dynamicznego SQL:
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;
Zobacz SQL Fiddle z wersją demonstracyjną