Eu tenho uma instância do SQL Server que possui um servidor vinculado a um servidor Oracle. Há uma tabela no servidor Oracle chamada PersonOptions
que contém os seguintes dados:
╔══════════╦══════════╗
║ PersonID ║ OptionID ║
╠══════════╬══════════╣
║ 1 ║ A ║
║ 1 ║ B ║
║ 2 ║ C ║
║ 3 ║ B ║
║ 4 ║ A ║
║ 4 ║ C ║
╚══════════╩══════════╝
Eu preciso dinamizar esses dados para que os resultados sejam:
╔══════════╦═════════╦══════════╦══════════╗
║ PersonID ║ OptionA ║ Option B ║ Option C ║
╠══════════╬═════════╬══════════╬══════════╣
║ 1 ║ 1 ║ 1 ║ ║
║ 2 ║ ║ ║ 1 ║
║ 3 ║ ║ 1 ║ ║
║ 4 ║ 1 ║ ║ 1 ║
╚══════════╩═════════╩══════════╩══════════╝
Alguma sugestão?
Existem algumas maneiras de realizar essa transformação de dados. Você tem acesso à
PIVOT
função, então isso será o mais fácil, mas se não, você pode usar uma função agregada e um arquivoCASE
.Versão Agregada/Caso:
Veja SQL Fiddle com demonstração
Pivô Estático:
Veja SQL Fiddle com demonstração
Versão dinâmica:
As duas versões acima funcionam muito bem se você tiver um número conhecido de valores, mas se seus valores forem desconhecidos, então você vai querer implementar o sql dinâmico e no Oracle você pode usar um procedimento:
Então você retorna os resultados, você usará:
Os resultados são os mesmos com todas as versões:
Isso seria o equivalente na sintaxe do SQL Server. Com base na minha leitura dos documentos do Oracle, NULLIF e PIVOT parecem ter o mesmo formato que seus parentes do SQL Server. O desafio será a lista dinâmica que precisa ser estática, a menos que você torne a consulta dinâmica como o Itzik demonstra , mas não tenho ideia se isso pode ser traduzido para P/SQL
Eu prefiro dinamizar a consulta manualmente, mas você também pode usar
PIVOT
.