Estou tentando não dinamizar algumas colunas em uma tabela. Isto é para uma ferramenta de relatório. Os dados de origem já estão normalizados. Eu sou capaz de obter os resultados desejados com uma série de declarações UNION ALL. Posso chegar perto do que quero com o UNPIVOT, mas me falta uma parte. Gostaria de obter o nome da coluna de origem em meus resultados UNPIVOT.
Table structure: | itemNumber | type | code | description |
| BN3466774 | AUD1 | 444 | desc--text |
| 1238udd74 | AUD1 | 331 | fdsafdsafdsa |
| AA34fg774 | MAN3 | 874 | asdfasdfasdf |
Desired Output: | itemNumber | SourceName | SourceValue |
| BN3466774 | type | AUD1 |
| BN3466774 | code | 444 |
| BN3466774 | description| desc--text |
| 1238udd74 | type | AUD1 |
| 1238udd74 | code | 331 |
| 1238udd74 | description| fdsafdsafdsa|
... you get the idea
Como mencionado anteriormente, posso obter esse resultado usando uma série de instruções UNION ALL
SELECT *
FROM
(
SELECT itemNumber, 'type' as SourceName, type as SourceValue FROM myTable
UNION ALL
SELECT itemNumber, 'code ' as SourceName, code as SourceValue FROM myTable
UNION ALL
SELECT itemNumber, 'description ' as SourceName, description as SourceValue FROM myTable
) as myValues
Minha consulta usando o UNPIVOT fica assim:
SELECT itemNumber, Value
FROM
(
SELECT itemNumber, type, code, description
FROM myTable
) AS tb
UNPIVOT
(
Value FOR attributes IN ( type, code, description)
) AS myValues
Esta consulta resulta nos seguintes dados:
Desired Output: | itemNumber | SourceValue |
| BN3466774 | AUD1 |
| BN3466774 | 444 |
| BN3466774 | desc--text |
| 1238udd74 | AUD1 |
| 1238udd74 | 331 |
| 1238udd74 | fdsafdsafdsa|
A razão pela qual eu gostaria de usar o UNPIVOT é porque ele tende a executar cerca de 50% mais rápido do que a abordagem UNION ALL e, em uma consulta, obtive cerca de 16 milhões de linhas sendo retornadas.
Gostaria de obter a coluna de origem em meus resultados UNPIVOT, mas não consegui gerar uma consulta que faça isso.
Você está perdendo uma nova coluna gerada por unpivoting
attributes