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

#1 Carlos Sacristan
19/07/2004 - 14:04 | Informe spam
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



Respuesta Responder a este mensaje
#2 Lara
19/07/2004 - 14:18 | Informe spam
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
>
>
>


Respuesta Responder a este mensaje
#3 Javier Loria
19/07/2004 - 15:20 | Informe spam
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):
==ÊSE 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
Respuesta Responder a este mensaje
#4 ulises
19/07/2004 - 16:29 | Informe spam
También comparto la idea de Javier de normalizar la tabla,
pero en todo caso si tienes una clave por fila también se
podría usar un JOIN :

SELECT t.clave, max(o.columna)
FROM tabla t JOIN
( SELECT clave, columna1 as columna FROM tabla
UNION ALL
SELECT clave, columna2 as columna FROM tabla
UNION ALL
...
SELECT clave, columna10 as columna FROM tabla ) o
ON ( t.clave = o.clave )
GROUP BY t.clave

hace unos días realice unas pruebas con cinco columnas y 1
millón de registros y el tiempo de respuesta fue igual al
del uso del CASE y superior al uso del UDF (aunque en este
último caso no tanto como para desechar este último sobre
todo si el código será reutilizado).

Saludos,
Ulises

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
Respuesta Responder a este mensaje
#5 José Hurtado
19/07/2004 - 22:03 | Informe spam
Hola Javier, siguiendo tu idea, que tal

CREATE FUNCTION Maximo(
@Valor1 INT, @Valor2 INT, @Valor3 INT, @Valor4 INT,
@Valor5 INT, @Valor6 INT, @Valor7 INT, @Valor8 INT,
@Valor9 INT, @Valor10 INT, @Valor11 INT, @Valor12 INT
)
RETURNS INT
AS
BEGIN
DECLARE @Max1 AS INT
DECLARE @Max2 AS INT
DECLARE @Max3 AS INT
DECLARE @Max4 AS INT
DECLARE @Max5 AS INT

SET @Max1 = CASE WHEN @Valor1>=@Valor2
THEN @Valor1 ELSE @Valor2 END
SET @Max2 = CASE WHEN @Valor3>=@Valor4
THEN @Valor3 ELSE @Valor4 END
SET @Max3 = CASE WHEN @Max1>=@Max2
THEN @Max1 ELSE @Max2 END

SET @Max1 = CASE WHEN @Valor5>=@Valor6
THEN @Valor5 ELSE @Valor6 END
SET @Max2 = CASE WHEN @Valor7>=@Valor8
THEN @Valor7 ELSE @Valor8 END
SET @Max4 = CASE WHEN @Max1>=@Max2
THEN @Max1 ELSE @Max2 END

SET @Max5 = CASE WHEN @Max3>=@Max4
THEN @Max3 ELSE @Max4 END

SET @Max1 = CASE WHEN @Valor9>=@Valor10
THEN @Valor9 ELSE @Valor10 END
SET @Max2 = CASE WHEN @Valor11>=@Valor12
THEN @Valor11 ELSE @Valor12 END
SET @Max4 = CASE WHEN @Max1>=@Max2
THEN @Max1 ELSE @Max2 END

RETURN CASE WHEN @Max4>=@Max5
THEN @Max4 ELSE @Max5 END
END
GO



"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


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida