Dada la siguiente tabla en SQL Server 2005:
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
¿Cuál es la mejor manera de escribir la consulta que arroja el siguiente resultado (es decir, una que arroja la columna final, una columna que contiene los valores mínimos de Col1, Col2 y Col 3 para cada fila )?
ID Col1 Col2 Col3 TheMin
-- ---- ---- ---- ------
1 3 34 76 3
2 32 976 24 24
3 7 235 3 3
4 245 1 792 1
ACTUALIZAR:
Para aclarar (como he dicho en los comentarios) en el escenario real la base de datos está correctamente normalizada . Estas columnas de "matriz" no están en una tabla real, sino en un conjunto de resultados que se requiere en un informe. Y el nuevo requisito es que el informe también necesita esta columna MinValue. No puedo cambiar el conjunto de resultados subyacente y, por lo tanto, estaba buscando en T-SQL una práctica "tarjeta para salir de la cárcel".
Probé el enfoque CASE mencionado a continuación y funciona, aunque es un poco engorroso. También es más complicado de lo que se indica en las respuestas porque debe tener en cuenta el hecho de que hay dos valores mínimos en la misma fila.
De todos modos, pensé en publicar mi solución actual que, dadas mis limitaciones, funciona bastante bien. Utiliza el operador UNPIVOT:
with cte (ID, Col1, Col2, Col3)
as
(
select ID, Col1, Col2, Col3
from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
select
ID, min(Amount) as TheMin
from
cte
UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
group by ID
) as minValues
on cte.ID = minValues.ID
Diré de antemano que no espero que esto ofrezca el mejor rendimiento, pero dadas las circunstancias (no puedo rediseñar todas las consultas solo para el nuevo requisito de la columna MinValue), es una forma bastante elegante de "salir de la cárcel tarjeta".