Eu tenho uma tabela que contém nomes de atributos com valores, mas cada linha é um atributo com seu valor,
ItemId | NomeAtributo do Item | ItemAtributeValue |
---|---|---|
405 | Inscrição | Conexões de alta ampacidade |
405 | Cor | Amarelo |
405 | Condições ambientais | Estanque |
405 | Material | Composto |
406 | Inscrição | Conexões de alta ampacidade |
406 | Cor | Azul |
406 | Material | Latão |
então eu criei outra tabela com todos os nomes de atributos possíveis para achatá-la para que cada linha contenha todos os valores para cada item.
ItemId | Inscrição | Cor | Condições ambientais | Material |
---|---|---|---|---|
405 | Conexões de alta ampacidade | Amarelo | Estanque | Composto |
406 | Conexões de alta ampacidade | Azul | Madeira |
Como é possível pegar a primeira tabela e inserir os dados de cada itemId na tabela acima nas colunas correspondentes?
Também preciso considerar que existem mais de cem nomes de atributos diferentes e nem todos os itens terão cada atributo ou valor. Não tenho certeza de que direção devo seguir com esse problema.
A solução acima funciona apenas se você tiver um número definido de atributos, se houver um número N de atributos, você deve usar o pivô dinâmico para isso
Para complementar a resposta já fornecida por Biju jose , aqui está uma maneira de fazer isso com SQL dinâmico. Se você adicionar novas linhas à
dbo.eav
tabela no meu exemplo, elas serão traduzidas automaticamente em novas colunas na saída.A saída do acima se parece com:
Como você pode ver, minha saída inclui ItemId 407, com um atributo de Tamanho "Pequeno".
Obviamente, à medida que o número exclusivo de
ItemAttributeName
valores aumenta, mais ampla a saída se torna. Parece improvável que você realmente queira fazer isso. O mais provável seria selecionar um ItemId específico e mostrar apenas as colunas aplicáveis.O exemplo abaixo se baseia no código acima para mostrar como você pode selecionar dinamicamente um específico
ItemId
(neste caso 407), para mostrar apenas as colunas relevantes:A saída disso se parece com:
O T-SQL gerado dinamicamente para a saída acima se parece com: