Basicamente ele destrava os dados usando 3 comandos select (1 para cada atributo) e
UNION
juntos para fazer uma expressão de tabela comum para que ele obtenha linhas para cada atributo de funcionário. select employeeId, department, attribute1, 1 rn from employees union all
select employeeId, department, attribute2, 2 rn from employees union all
select employeeId, department, attribute3, 3 rn from employees
A outra tabela está usando uma função de janela para atribuir um número ao atributo, departamento. Ele usa esse número mais tarde para voltar aos seus dados não dinâmicos. Ele postou seu código para o exemplo.
select a.*, row_number() over (partition by department order by attributeID) rn
from attributes a
Eu sugiro que você use os dados de exemplo que ele forneceu e execute o seguinte. Isto irá mostrar-lhe os CTEs. Acho que uma vez que você veja esses dados, fará mais sentido.
with a as (
select a.*, row_number() over (partition by department order by attributeID) rn
from attributes a),
e as (
select employeeId, department, attribute1, 1 rn from employees union all
select employeeId, department, attribute2, 2 rn from employees union all
select employeeId, department, attribute3, 3 rn from employees
)
SELECT * from a
SELECT * from e