Вы ищете противоположность кросс-таблицы или разворота: вы ищете разворотную точку
В стандартном SQL вы могли бы сделать это с помощью UNION ALL (если СУБД не поддерживает оператор unpivot
, а Postgres - нет):
select dlimportdate, 1 as colno, col1 as value
from the_table
union all
select dlimportdate, 2, col1
from the_table
union all
...
Однако в Postgres есть более короткий способ сделать это. Создайте массив столбцов, затем используйте unnest, чтобы превратить их в строки:
select dlimportdate, t.colno, t.value
from the_table
cross join unnest(array[col1, col2, col3, ...]) with ordinality as t(value, colno);