El enlace que proporcionó Kangkan le mostrará cómo lograr esto si supiera los nombres de las columnas de antemano. Vamos por la misma lógica, excepto que usamos SQL dinámico para construir la declaración. Hay 2 partes para cada campo que debe incluir, el campo en la declaración de selección y una combinación adecuada para obtener el valor... por lo que necesitaremos construir la declaración en dos partes
Primero declare 3 variables para construir esto... Iré con @select, @join y @sql para este ejemplo. Dar a las variables los valores iniciales
set @select = 'select user_id,'
set @join = 'from table t'
ahora declare y cargue un cursor con los distintos valores en el campo table.key. Voy a usar @field ya que la variable se completa con el campo table.key distinto. Luego recorrelo construyendo las dos variables:
set @select = @select + ', ' + @field + '.value as '[email protected]+'
set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.user_id = t.user_id
(la combinación está diseñada para usar el valor en @field como el alias de la tabla)
recorra el cursor creando @select y @join. Al final del bucle:
set @sql = @select + @join + 'where clause if you want'
exec @sql
El SQL dinámico creado de esta manera puede ser un dolor absoluto para solucionar problemas (y hacerlo bien) y abrir problemas de seguridad ... pero es la única forma en que puedo ver esto logrado. Esté atento a las restricciones de tamaño en sus variables... si tiene demasiadas claves distintas allí, las variables crecen demasiado. Lo siento, no puedo ser más exacto con el pseudo en esto... encontrarás que construir sql dinámico en sql es laborioso.