Oracle 11g предоставляет PIVOT
операцию, которая делает то, что вы хотите.
Решение Oracle 11g
select * from
(select id, k, v from _kv)
pivot(max(v) for k in ('name', 'age', 'gender', 'status')
(Примечание: у меня нет копии 11g, чтобы проверить это, поэтому я не проверил ее функциональность)
Я получил это решение от: http://orafaq.com/wiki/PIVOT
РЕДАКТИРОВАТЬ - опция pivot xml (также Oracle 11g)
Очевидно, есть также опция pivot xml
, когда вы не знаете всех возможных заголовков столбцов, которые могут вам понадобиться. (см. раздел XML TYPE в нижней части страницы, расположенный по адресу http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html)
select * from
(select id, k, v from _kv)
pivot xml (max(v)
for k in (any) )
(Примечание. Как и раньше, у меня нет копии 11g, чтобы проверить это, поэтому я не проверял ее функциональность)
Edit2: Изменено v
в операторах pivot
и pivot xml
на max(v)
, поскольку предполагается, что оно будет агрегировано, как указано в одном из комментариев. Я также добавил предложение in
, которое не является обязательным для pivot
. Конечно, необходимость указывать значения в предложении in
отрицательно сказывается на цели создания полностью динамического запроса сводной / перекрестной таблицы, как было желание автора этого вопроса.