O Oracle 11g fornece um
PIVOT
operação que faz o que você quer. Solução Oracle 11g
select * from
(select id, k, v from _kv)
pivot(max(v) for k in ('name', 'age', 'gender', 'status')
(Observação:não tenho uma cópia do 11g para testar isso, então não verifiquei sua funcionalidade)
Eu obtive esta solução de:http://orafaq.com/wiki/PIVOT
EDIT -- opção xml de pivô (também Oracle 11g)
Aparentemente, há também um
pivot xml
opção para quando você não conhece todos os títulos de coluna possíveis que você pode precisar. (consulte o TIPO XML seção próxima à parte inferior da página localizada em 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) )
(Observação:como antes, não tenho uma cópia do 11g para testar isso, então não verifiquei sua funcionalidade)
Edit2:
v
alterado no pivot
e pivot xml
declarações para max(v)
uma vez que deve ser agregado conforme mencionado em um dos comentários. Eu também adicionei o in
cláusula que não é opcional para pivot
. Claro, ter que especificar os valores no in
cláusula anula o objetivo de ter uma consulta dinâmica / crosstab completamente dinâmica, como era o desejo do pôster desta pergunta.