T-SQL combina múltiples filas en una sola fila

Tengo este T-SQL (simplificado):

select 3.00 as score1, null as score2, null as score3, null as score4 union all select null as score1, 4.5 as score2, 1.5 as score3, null as score4 

Que produce esto:

 score1 score2 score3 score4 ------------------------------ 3.00 NULL NULL NULL NULL 4.5 1.5 NULL 

Pero quiero unirme en una fila, así:

 score1 score2 score3 score4 ------------------------------ 3.00 4.5 1.5 NULL 

Lo siento, estoy dibujando en blanco (es tarde en el día).

¿Necesito una table temporal?

La razón por la que hago esto es porque tengo la siguiente asociación:

Opiniones 1 .. * Puntuaciones

Entonces, una combinación regular produce 1 fila para cada puntaje, pero quiero insert un logging (en otra tabla), que tiene una columna para cada logging, si sabes lo que quiero decir:

 INSERT INTO OtherTable (ReviewId, Score1, Score2, Score3, Score4) ???? 

Espero que tenga sentido.

EDITAR

Basado en @OMG Ponies answer (que acaba de eliminar), se me ocurrió esto:

 SELECT CASE MAX(x.score1) WHEN 0 THEN NULL ELSE MAX(x.score1) END AS score4 CASE MAX(x.score2) WHEN 0 THEN NULL ELSE MAX(x.score2) END AS score4 CASE MAX(x.score3) WHEN 0 THEN NULL ELSE MAX(x.score3) END AS score4 CASE MAX(x.score4) WHEN 0 THEN NULL ELSE MAX(x.score4) END AS score4 FROM (select 3.00 as score1, 0 as score2, 0 as score3, 0 as score4 union all select 0 as score1, 4.5 as score2, 1.5 as score3, 0 as score4) x 

Pero es bastante feo. ¿Alguna otra idea?

Bajo la suposition de que solo una de las dos filas tiene un valor en puntaje1, puntaje2, … De lo contrario, vuelva a escribir su consulta utilizando la function NULLIF .

 SELECT NULLIF(ISNULL(NULLIF(x.score1, 0), y.score1), 0) score1, NULLIF(ISNULL(NULLIF(x.score2, 0), y.score2), 0) score2, NULLIF(ISNULL(NULLIF(x.score3, 0), y.score3), 0) score3, NULLIF(ISNULL(NULLIF(x.score4, 0), y.score4), 0) score4 FROM (SELECT 3.00 AS score1, 0 AS score2, 0 AS score3, 0 AS score4) x CROSS JOIN (SELECT 0 AS score1, 4.5 AS score2, 1.5 AS score3, 0 AS score4) y 

La consulta @OMG Ponies / RPM1984 parece funcionar:

 SELECT MAX(x.score1), MAX(x.score2), MAX(x.score3), MAX(x.score4) FROM (select 3.00 as score1, null as score2, null as score3, CAST(null as int) as score4 union all select null as score1, 4.5 as score2, 1.5 as score3, null as score4) x 

Lo que resulta en:

 3.00 4.5 1.5 NULL 

No estoy seguro de qué haría si varias filas definen el mismo puntaje.


Tengo que agregar CAST (nulo como int) a la cuarta columna, porque de lo contrario no hay manera de que SQL Server resuelva el tipo de la cuarta columna; todo lo que tiene son dos nulos y los nulos pueden ser de cualquier tipo.

Cuando lo bash (SQL 2008) usando un simple MAX() parece funcionar:

 SELECT MAX(score1), MAX(score2), MAX(score3), MAX(score4) FROM (select 3.00 as score1, null as score2, null as score3, null as score4 union all select null as score1, 4.5 as score2, 1.5 as score3, null as score4) s 

Ejecuté esta testing

 declare @t table (i int null) insert @t values (null) insert @t values (1) select MAX(i) from @t 

¿Es esto lo que quieres hacer?

Terminé yendo con mi consulta original (gracias a @OMG Ponies por ponerme en el path correcto):

 SELECT CASE MAX(x.score1) WHEN 0 THEN NULL ELSE MAX(x.score1) END AS score4 CASE MAX(x.score2) WHEN 0 THEN NULL ELSE MAX(x.score2) END AS score4 CASE MAX(x.score3) WHEN 0 THEN NULL ELSE MAX(x.score3) END AS score4 CASE MAX(x.score4) WHEN 0 THEN NULL ELSE MAX(x.score4) END AS score4 FROM (select 3.00 as score1, 0 as score2, 0 as score3, 0 as score4 union all select 0 as score1, 4.5 as score2, 1.5 as score3, 0 as score4) x