SQL - obtener maximo dia de varios mese

   
Vista:

obtener maximo dia de varios mese

Publicado por ricardo (2 intervenciones) el 17/10/2014 18:04:52
Hola a todos,

Tengo un problema con una consulta, la cual debo obtener de varia columnas que son dia1,dia2,dia3,..,dia12 el maximo dia. necesito sacar el maximo entre todas las 12 columna y retornar un solo valor que seria el maximo para cada nit.

tabla

cedula 1111111111111

dia01 0
dia02 0
dia03 30
dia04 0
dia05 8
dia06 20
dia07 0
dia08 7
dia09 1
dia10 40
dia11 3
dia12 2

muchas gracias de ante mano por la ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

obtener maximo dia de varios mese

Publicado por leonardo_josue (877 intervenciones) el 17/10/2014 21:27:01
Hola Ricardo...

Hay varias formas de obtener lo que quieres, pero olvidaste mencionar con qué BD's estás trabajando. Dependiendo del motor, la consulta se puede simplificar o complicar demasiado.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

obtener maximo dia de varios mese

Publicado por ricardo (2 intervenciones) el 17/10/2014 23:33:36
Hola Leonardo, estoy trabajando con informix
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

obtener maximo dia de varios mese

Publicado por leonardo_josue (877 intervenciones) el 21/10/2014 22:20:20
Hola de nuevo Ricardo:

Lamentablemente no he trabajado con Informix, por lo tanto, no sé mucho acerca de las funciones propias del motor que pudieran ayudarte, sin embargo, trataré de hacer un ejemplo con SQL Estandar que igual y te puede ayudar.

De entrada, tal como tienes tus datos, creo que tiene un error grave de diseño, es decir, no es correcto que tengas en una tabla tantos campos en donde almacenes información repetitiva, sobre todo si en varios de ellos puedes dejar valores en cero... pero bueno, esa ya es otra cuestión que igual y no viene al caso. Como te mencionaba ayer, hay muchas formas de llegar a un mismo resultado, depende mucho del motor, aqui te presento dos. El ejemplo está hecho con MySQL, pero traté de utilizar como mencioné SQL Estandar que pudieras transportas a Informix sin problemas. Supongamos que tenemos esta tabla:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla1;
+-------------+--------+--------+--------+--------+
| descripcion | campo1 | campo2 | campo3 | campo4 |
+-------------+--------+--------+--------+--------+
| uno         |     10 |      9 |      8 |      7 |
| dos         |      9 |      6 |     18 |      7 |
| tres        |      3 |      9 |      8 |     14 |
| cuatro      |     10 |     19 |      8 |      7 |
+-------------+--------+--------+--------+--------+
4 rows in set (0.00 sec)

Si te entendí bien, lo que necesitas es obtener simplemente el valor mayor de todas las columnas, este valor puede estar en cada una de las columnas1 a 4. Una forma sería utilizando comparaciones con CASE WHEN, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> SELECT
    ->        descripcion,
    ->        CASE WHEN (campo1 >= campo2 AND
    ->                   campo1 >= campo3 AND
    ->                   campo1 >= campo4) THEN campo1 ELSE
    ->        CASE WHEN (campo2 >= campo1 AND
    ->                   campo2 >= campo3 AND
    ->                   campo2 >= campo4) THEN campo2 ELSE
    ->        CASE WHEN (campo3 >= campo1 AND
    ->                   campo3 >= campo2 AND
    ->                   campo3 >= campo4) THEN campo3 ELSE
    ->        CASE WHEN (campo4 >= campo1 AND
    ->                   campo4 >= campo2 AND
    ->                   campo4 >= campo3) THEN campo4
    ->        END
    ->        END
    ->        END
    ->        END mayor
    -> FROM tabla1;
+-------------+-------+
| descripcion | mayor |
+-------------+-------+
| uno         |    10 |
| dos         |    18 |
| tres        |    14 |
| cuatro      |    19 |
+-------------+-------+
4 rows in set (0.00 sec)

Es decir, haces una condición EXHAUSTIVA, lo que quiere decir que tomas cada columna y verificas que sea el mayor con respecto a TODAS LAS DEMÁS COLUMNAS, si es así, entonces lo imprimies, en caso contrario continuas con la siguiente columna y haces lo mismo. Esto puede resultar muy pesado para el motor.

Otra forma, y que tendría que ver algo en lo que te comento de que tienes un mal modelo de tablas, sería hacer UNION's, para cambiar las columnas a registros y después simplemente utilizar funciones de agrupación para obtener el MAX valor, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT descripcion, MAX(campo) mayor FROM
    -> (
    ->   SELECT descripcion, campo1 campo FROM tabla1
    ->   UNION
    ->   SELECT descripcion, campo2 campo FROM tabla1
    ->   UNION
    ->   SELECT descripcion, campo3 campo FROM tabla1
    ->   UNION
    ->   SELECT descripcion, campo4 campo FROM tabla1) T
    -> GROUP BY descripcion;
+-------------+-------+
| descripcion | mayor |
+-------------+-------+
| uno         |    10 |
| dos         |    18 |
| tres        |    14 |
| cuatro      |    19 |
+-------------+-------+
4 rows in set (0.00 sec)

Ambas consultas llegan al mismo resultado. Estas son solo dos formas de obtener el resultado que esperas, pero igual y no es la más óptima, te recomiendo darle un vistazo a la documentación de Informix para ver el uso de otras funciones o procedimientos almacenados que te puedan servir.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar