¿puedo hacer? select max(select max1, select max2)

15/12/2004 - 12:54 por -=JOE MAN=- | Informe spam
Me explico.

Dentro de la misma tabla tengo tres campos numericos (c1,c2,c3) y
necesito encontrar el máximo valor de entre los máximos valores de los
tres campos. O sea , esto:

SELECT MAX(select max(c1)from tabla,select max(c2)from tabla,select
max(c3)from tabla) FROM TABLA)

Y si no es esto posible ¿existe una aproximación al problema? Ahora lo
tengo en un procedimiento almacenado con varios IF, pero no me gusta
nada. Es muy poco elegante.


gracias mil

Preguntas similare

Leer las respuestas

#6 -=JOE MAN=-
15/12/2004 - 16:01 | Informe spam
son todos integer

Salvador Ramos wrote:
De qué tipo de datos son los campos c1, c2 y c3 ?
Podrías poner aquí los DDLs y las inserts de los datos con los que estás
utilizando para que lo podamos probar ?

Respuesta Responder a este mensaje
#7 Salvador Ramos
15/12/2004 - 16:20 | Informe spam
No lo entiendo, debe haber algo adicional.

Prueba lo siguiente:
CREATE TABLE [dbo].[prueba01] (
[c1] [int] NOT NULL ,
[c2] [int] NOT NULL ,
[c3] [int] NOT NULL
) ON [PRIMARY]
GO

INSERT INTO prueba01 VALUES(9, 7, 5)
INSERT INTO prueba01 VALUES(1, 8, 3)
INSERT INTO prueba01 VALUES(7, 8, 7)
GO

select max(case
when c1 > c2 and c1 > c3 then c1
when c2 > c1 and c2 > c3 then c2
else c3
end )
from Prueba01

Verás que el resultado es 9.

Pon aquí las DDL y las INSERT con tus tablas y datos e intentaremos ver el
problema.


Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net
¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?

"-=JOE MAN=-" escribió en el mensaje
news:%
son todos integer

Salvador Ramos wrote:
> De qué tipo de datos son los campos c1, c2 y c3 ?
> Podrías poner aquí los DDLs y las inserts de los datos con los que estás
> utilizando para que lo podamos probar ?
>
Respuesta Responder a este mensaje
#8 Javier Loria
15/12/2004 - 17:47 | Informe spam
Hola:
Umm, ese 795 me suena a que se fue un SUM en lugar de MAX o que se fue
sin el WHERE. Revisa de nuevo la ejecucion.
Pero si hay un problema de logica!!!. Que pasa si C1 y C2 son iguales y
mayores que C3. En el CASE original C1 no es mayor que C2 por ende no se usa
el primer WHEN, tampoco el sengundo porque C2 es mayor que C1. Se termina
usando C3 que es la unica respuesta incorrecta :(
En todo caso me parece que se puede simplificar el CASE de la siguiente
forma:
==SELECT MAX(CASE
WHEN C1>C2 AND C1>C3 THEN C1
WHEN C2>C3 THEN C2
ELSE C3 END)
FROM TABLA WHERE Cliente='1'
== Los NULOS complican enormemente el CASE, ya que hay que considerarlos
por aparte (son mayores o menores?)
Saludos,


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

"-=JOE MAN=-" wrote in message
news:
Algo falla en esta SELECT con CASE que me pasaste Tako.
Siguiendo tu lógica Si yo ejecuto:

select max(case
when c1 > c2 and c1 > c3 then c1
when c2 > c1 and c2 > c3 then c2
else c3
end )
from TABLA WHERE Cliente='1'

El resultado es: 795

Pero si hago

SELECT MAX(C1) FROM TABLA WHERE CLIENTE='1'
SELECT MAX(C2) FROM TABLA WHERE CLIENTE='1'
SELECT MAX(C3) FROM TABLA WHERE CLIENTE='1'

El resultado es:
74
79
78

Algo no me cuadra.



Tako wrote:

>
> Que tal algo de este estilo
>
> select max(case
> when c1 > c2 and c1 > c3 then c1
> when c2 > c1 and c2 >c3 then c2
> else c3
> end )
>
> from tabla
>
Respuesta Responder a este mensaje
#9 -=JOE MAN=-
16/12/2004 - 16:12 | Informe spam
ahi vá!, no me di cuenta de que hay que tener en cuenta los nulos.
uff

Javier Loria wrote:
Hola:
Umm, ese 795 me suena a que se fue un SUM en lugar de MAX o que se fue
sin el WHERE. Revisa de nuevo la ejecucion.
Pero si hay un problema de logica!!!. Que pasa si C1 y C2 son iguales y
mayores que C3. En el CASE original C1 no es mayor que C2 por ende no se usa
el primer WHEN, tampoco el sengundo porque C2 es mayor que C1. Se termina
usando C3 que es la unica respuesta incorrecta :(
En todo caso me parece que se puede simplificar el CASE de la siguiente
forma:
==> SELECT MAX(CASE
WHEN C1>C2 AND C1>C3 THEN C1
WHEN C2>C3 THEN C2
ELSE C3 END)
FROM TABLA WHERE Cliente='1'
==> Los NULOS complican enormemente el CASE, ya que hay que considerarlos
por aparte (son mayores o menores?)
Saludos,


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

"-=JOE MAN=-" wrote in message
news:

Algo falla en esta SELECT con CASE que me pasaste Tako.
Siguiendo tu lógica Si yo ejecuto:

select max(case
when c1 > c2 and c1 > c3 then c1
when c2 > c1 and c2 > c3 then c2
else c3
end )
from TABLA WHERE Cliente='1'

El resultado es: 795

Pero si hago

SELECT MAX(C1) FROM TABLA WHERE CLIENTE='1'
SELECT MAX(C2) FROM TABLA WHERE CLIENTE='1'
SELECT MAX(C3) FROM TABLA WHERE CLIENTE='1'

El resultado es:
74
79
78

Algo no me cuadra.



Tako wrote:


Que tal algo de este estilo

select max(case
when c1 > c2 and c1 > c3 then c1
when c2 > c1 and c2 >c3 then c2
else c3
end )

from tabla








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