Suponha as duas tabelas a seguir (e ignore a qualidade do design do banco de dados):
- A Tabela 1 tem colunas
id
,sequence_number
,value
: contém muitas linhas. - A Tabela 2 tem as colunas
id
,seq1
,seq2
,seq3
,seq4
,seq5
: está vazia.
O objetivo é preencher a Tabela 2 com o valor da Tabela 1, de modo que se na Tabela 1 uma linha for sequence_number = 3
; value = 1564.1
, então na Tabela 2 deve-se inserir uma linha com seq3 = 1564.1
. (as outras colunas além de id
devem estar vazias).
Como fazer isso no SQL? Não quero codificar todas as 5 opções (porque no meu caso de uso real há mais de 50), mas não sei como condicionar o nome da coluna que deve receber o valor com base no valor.
Usando instruções CASE..
Se você considerar esse código rígido, então (até onde eu sei) sua única outra opção seria o SQL dinâmico dentro de um bloco plpgsql.
Este é basicamente um problema de tabulação cruzada / crosstab / pivô.
Dadas estas definições de tabela exatas:
Tudo o que você precisa é esta consulta de crosstab básica:
Também a maneira mais rápida que posso pensar.
Você precisa do módulo adicional tablefunc instalado. Fundamentos:
Se alguma das suas tabelas tiver mais colunas, seja mais explícito no primeiro parâmetro e/ou adapte para mais colunas:
Mais automação
Se você precisa fazer isso com frequência, pode automatizar ainda mais:
Usando o formulário de 2 parâmetros
crosstab_n()
conforme definido na resposta vinculada , a consulta pode ser tão simples quanto:Substitua 5 por 50 se você tiver tantas
seq
N
colunas.