Valor máximo de varias columnas

19/07/2004 - 13:54 por Lara | Informe spam
Hola grupo!!!

Partiendo de una tabla que tiene tres columnas:
columna1
columna2
columna3

Quiero obtener por cada fila, una columna que contenga el valor más alto de
las tres columnas.

Ejemplo:

columna1 columna2 columna3
1 2 3
2 5 4
6 5 4


según estos datos yo quisiera obtener una consulta que me de:

Columna
3
5
6

El script de creación de la tabla es:


CREATE TABLE [dbo].[Tabla] (
[Columna1] [int] NULL ,
[Columna2] [int] NULL ,
[Columna3] [int] NULL)

Insert into Tabla (Columna1, Columna2, Columna3) values (1,2,3)
Insert into Tabla (Columna1, Columna2, Columna3) values (2,5,4)
Insert into Tabla (Columna1, Columna2, Columna3) values (6,5,4)



Muchas gracias!
Lara

Preguntas similare

Leer las respuestas

#6 Lara
20/07/2004 - 08:18 | Informe spam
Muchas gracias a todos por el interés mostrado.
No puedo rediseñar la tabla, este diseño me viene dado por el cliente y no
puedo tocarlo.
Voy a echarle un vistazo a todas vuestras soluciones y a ver qué tal.

Saludos!
Lara


"Javier Loria" escribió en el mensaje
news:
Hola:
Si Carlos me permite.
El diseno de la Tabla me deja algunas dudas, y "el valor mas alto de


las
tres columnas" no deja claro si es para cada fila o del total de filas de


la
Tabla.
Si es del Total de la Tabla, es facil:
==> SELECT MAX(Columna1) FROM Tabla UNION ALL
SELECT MAX(Columna2) FROM Tabla UNION ALL
SELECT MAX(Columna3) FROM Tabla UNION ALL
..
SELECT MAX(Columna12) FROM Tabla
==> Si es para cada Fila el Valor maximo de las 12 Columnas (algo asi como
el maximo de 12 meses), considera un REDISENO de la Tabla para


NORMALIZARLA,
creando una Tabla Adicional con el Valor de cada mes en una Fila


diferente.
Esto hace muy facil la consulta porque es solo un GROUP BY con MAX.
Si siempres quieres mantener este diseno, hay 2 alternativas.
Opcion 1:
El Case de Carlos (simplificandolo un poco):
> CASE WHEN Columna1>=Columna2
AND Columna1>=Columna3
AND Columna1>=Columna4
AND Columna1>=Columna5
AND Columna1>=Columna6
AND Columna1>=Columna7
AND Columna1>=Columna8
AND Columna1>=Columna9
AND Columna1>=Columna10
AND Columna1>=Columna11
AND Columna1>=Columna12 THEN Columna1
CASE WHEN Columna2>=Columna3
AND Columna2>=Columna4
AND Columna2>=Columna5
AND Columna2>=Columna6
AND Columna2>=Columna7
AND Columna2>=Columna8
AND Columna2>=Columna9
AND Columna2>=Columna10
AND Columna2>=Columna11
AND Columna2>Columna12 THEN Columna2
CASE WHEN Columna3>=Columna4
AND Columna3>=Columna5
AND Columna3>=Columna6
AND Columna3>=Columna7
AND Columna3>=Columna8
AND Columna3>=Columna9
AND Columna3>=Columna10
AND Columna3>=Columna11
AND Columna3>Columna12 THEN Columna3
...
CASE WHEN Columna11>=Columna12
THEN Columna11
ELSE Columna12
END
> Esto asumiendo que ninguna columna soporta Nulos, ya que es en ese


caso
hay que incluir como 60 funciones COALESCE(ColumnaX, 0).

Opcion 2:
Construir tu propia funcion Maximo, que compare 2 valores y retorne el
resultado del mayor. En este caso se resuelve:
> CREATE FUNCTION Maximo(@Valor1 INT, @Valor2 INT)
RETURNS INT
AS
BEGIN
RETURN CASE WHEN @Valor1>=@Valor2 THEN @Valor1
ELSE @Valor2 END
END
GO
SELECT dbo.Maximo(Columna1,
dbo.Maximo(Columna2,
dbo.Maximo(Columna3,
dbo.Maximo(Columna4,
dbo.Maximo(Columna5,

dbo.Maximo(Columna12))))))))))))
FROM Tabla
> Espero haber entendido y que te ayude el codigo,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Lara escribio:
> Muchas gracias Carlos.
> Esta forma es válida, pero realmente tengo 12 columnas. Entonces si
> hubiera una forma en la que tuviera que escribir menos código
> mejor
> De momento voy a ver qué tal con tu solución.
>
> Saludos!
>
>
>
> "Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
> news:%
>> SELECT valor = CASE WHEN columna1>columna2 THEN CASE WHEN
>> columna1>columna3 THEN columna1 END
>> WHEN columna2>columna3 THEN columna2
>> ELSE columna3
>> END
>> FROM tabla
>>
>>
>> Un saludo
>>
>> -
>> "Sólo sé que no sé nada. " (Sócrates)
>>
>> Por favor, responder únicamente al foro
>> Se agradece la inclusión de sentencias DDL
>>
>>
>> "Lara" escribió en el mensaje
>> news:
>>> Hola grupo!!!
>>>
>>> Partiendo de una tabla que tiene tres columnas:
>>> columna1
>>> columna2
>>> columna3
>>>
>>> Quiero obtener por cada fila, una columna que contenga el valor más
>>> alto de las tres columnas.
>>>
>>> Ejemplo:
>>>
>>> columna1 columna2 columna3
>>> 1 2 3
>>> 2 5 4
>>> 6 5 4
>>>
>>>
>>> según estos datos yo quisiera obtener una consulta que me de:
>>>
>>> Columna
>>> 3
>>> 5
>>> 6
>>>
>>> El script de creación de la tabla es:
>>>
>>>
>>> CREATE TABLE [dbo].[Tabla] (
>>> [Columna1] [int] NULL ,
>>> [Columna2] [int] NULL ,
>>> [Columna3] [int] NULL)
>>>
>>> Insert into Tabla (Columna1, Columna2, Columna3) values (1,2,3)
>>> Insert into Tabla (Columna1, Columna2, Columna3) values (2,5,4)
>>> Insert into Tabla (Columna1, Columna2, Columna3) values (6,5,4)
>>>
>>>
>>>
>>> Muchas gracias!
>>> Lara


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida