Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Duda sobre if en mysql

Estas en el tema de Duda sobre if en mysql en el foro de Mysql en Foros del Web. Hola amigos de foros del web en esta ocacion les queria hacer una consulta que a lo mejor para ustedes es facil pero yo no ...
  #1 (permalink)  
Antiguo 09/03/2012, 10:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 15 años, 4 meses
Puntos: 0
Pregunta Duda sobre if en mysql

Hola amigos de foros del web en esta ocacion les queria hacer una consulta que a lo mejor para ustedes es facil pero yo no puedo dar con la solucion ojala me puedan ayudar ya que en otros foros no han podido.

miren lo que quiero hacer es crear un reporte en una consulta con if para sacar calculos segun una condicion que en este caso seria segun un ciclo calcule el promedio de un profesor. a continuacion dejo el codigo.

Código MySQL:
Ver original
  1. select t2.supervisor, t2.nro_ciclo, if(t2.nro_ciclo=1, t2.promedio, 0),
  2.     if(t2.nro_ciclo=2, t2.promedio, 0),
  3.     if(t2.nro_ciclo=3, t2.promedio, 0),
  4.     if(t2.nro_ciclo=4, t2.promedio, 0) from(
  5.     select t1.supervisor,ROUND(avg(t1.nota_final),1) as promedio, t1.nro_ciclo,t1.plataforma
  6.     from (select nombre, nota_final, nro_Ciclo, supervisor, plataforma
  7.     from dotacion
  8.     inner join evaluacion
  9.     on dotacion_asignada_iddotacion_asignada =iddotacion
  10.     inner join calendario_evaluacion on idcalendario_evaluacion = Calendario_Evaluacion_idCalendario_Evaluacion
  11.     where
  12.     activo = 1
  13.     and year_carga = (select year(now()))
  14.     and mes_carga= (select max(mes_carga) from dotacion where year_carga=(select year(now())))
  15.     group by sesion_id, nro_ciclo) t1
  16.     group by t1.nro_ciclo, t1.supervisor) t2

y esto me me muestra los datos asi

E. Cancino 1 53.6 0 0 0
J. Santander 1 49.6 0 0 0
E. Cancino 2 0 50.0 0 0
J. Santander 2 0 54.3 0 0
J. Santander 3 0 0 28.5 0
J. Santander 4 0 0 0 55.0

pero necesito que los muestre asi

E. Cancino 1 53.6 50.0 0 0
J. Santander 1 49.6 54.3 28.5 55.0

lointente agregando un group by supervisor y me muestra asi

E. Cancino 1 53.6 0.0 0.0 0.0
J. Santander 1 49.6 0.0 0.0 0.0

solo calcula el primer ciclo y no se como hacer que muestre los demas porfavor ayudenme se los agradeceria mucho
  #2 (permalink)  
Antiguo 09/03/2012, 10:10
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Duda sobre if en mysql

o si es que alguien sabe de que otra manera puedo obtener los datos de la manera que necesito que sea asi

Nombre1 Nota 1 Nota 2 Nota 3 Nota 4
Nombre2 Nota 1 Nota 2 Nota 3 Nota 4
Nombre3 Nota 1 Nota 2 Nota 3 Nota 4
  #3 (permalink)  
Antiguo 09/03/2012, 11:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Duda sobre if en mysql

Hola massu_vago:

No sé si entendí bien la idea, pero creo que la consulta sería más o menos así.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-----------+--------------+----------+
  3. | id   | nro_ciclo | supervisor   | cantidad |
  4. +------+-----------+--------------+----------+
  5. |    1 |         1 | E. Cancino   |       10 |
  6. |    2 |         2 | E. Cancino   |        9 |
  7. |    3 |         3 | E. Cancino   |       11 |
  8. |    4 |         1 | E. Cancino   |        6 |
  9. |    5 |         2 | E. Cancino   |       10 |
  10. |    6 |         3 | E. Cancino   |       13 |
  11. |    7 |         1 | J. Santander |       10 |
  12. |    8 |         2 | J. Santander |        5 |
  13. |    9 |         3 | J. Santander |        9 |
  14. +------+-----------+--------------+----------+
  15. 9 rows in set (0.00 sec)
  16.  
  17. mysql> SELECT
  18.     -> supervisor,
  19.     -> SUM(IF(nro_ciclo = 1, cantidad, 0)) total1,
  20.     -> SUM(IF(nro_ciclo = 1, 1, 0))  nota1,
  21.     -> SUM(IF(nro_ciclo = 1, cantidad, 0)) / SUM(IF(nro_ciclo = 1, 1, 0))  
  22.     -> promedioNota1,
  23.     -> SUM(IF(nro_ciclo = 2, cantidad, 0)) total2,
  24.     -> SUM(IF(nro_ciclo = 2, 1, 0))  nota2,
  25.     -> SUM(IF(nro_ciclo = 3, cantidad, 0)) total3,
  26.     -> SUM(IF(nro_ciclo = 3, 1, 0))  nota3
  27.     -> FROM tabla
  28.     -> GROUP BY supervisor;
  29. +--------------+--------+-------+---------------+--------+-------+--------+-------+
  30. | supervisor   | total1 | nota1 | promedioNota1 | total2 | nota2 | total3 | nota3 |
  31. +--------------+--------+-------+---------------+--------+-------+--------+-------+
  32. | E. Cancino   |     16 |     2 |        8.0000 |     19 |     2 |     24 |2      |
  33. | J. Santander |     10 |     1 |       10.0000 |      5 |     1 |      9 |1      |
  34. +--------------+--------+-------+---------------+--------+-------+--------+-------+
  35. 2 rows in set (0.00 sec)

En tu consulta veo que involucras más de una tabla, pero no nos das información al respecto, si continuas con problemas es preferible comenzar desde lo básico: dinos cómo es la estructura de tus tablas, pon algunos datos de ejemplo de cada una de ellas y dinos qué es lo que esperas de salida. Es posible que a partir de esta información podamos proponerte alguna otra forma de obtener el mismo resultado.

Saludos
Leo.
  #4 (permalink)  
Antiguo 09/03/2012, 11:55
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Duda sobre if en mysql

mira el modelo de datos que uso es relacional todas las tablas estan relacionadas:

mira la consulta de donde vienen todos los datos es esta

Código MySQL:
Ver original
  1. select nombre, nota_final, nro_Ciclo, supervisor, plataforma
  2.     from dotacion
  3.     inner join evaluacion
  4.     on dotacion_asignada_iddotacion_asignada =iddotacion
  5.     inner join calendario_evaluacion on idcalendario_evaluacion = Calendario_Evaluacion_idCalendario_Evaluacion
  6.     where
  7.     activo = 1
  8.     and year_carga = (select year(now()))
  9.     and mes_carga= (select max(mes_carga) from dotacion where year_carga=(select year(now())))
  10.     group by sesion_id, nro_ciclo

y esto trae lo siguiente
NOMBRE NOTA CICLO SUPERVISOR
DORIS ROSARIO 10 2 J. Santander
CRISTIAN ALBERTO 70 1 E. Cancino
TAMARA ALICIA 44 1 J. Santander
TAMARA ALICIA 59 2 J. Santander
TAMARA ALICIA 40 3 J. Santander
TAMARA ALICIA 70 4 J. Santander
CLAUDIA ANDREA 58 1 J. Santander
CLAUDIA ANDREA 70 2 J. Santander
FABIAN IGNACIO 55 1 E. Cancino

te explico el contexto la consulta debe traer a todos los alumnos con su nota y el ciclo que fueron evaluados(siempre son 4) , a partir de esta consulta saco el promedio de cada supervisor que la hago con la siguiente consulta a partir de la anterior

Código MySQL:
Ver original
  1. select t1.supervisor,ROUND(avg(t1.nota_final),1) as promedio, t1.nro_ciclo
  2.     from (select nombre, nota_final, nro_Ciclo, supervisor
  3.     from dotacion
  4.     inner join evaluacion
  5.     on dotacion_asignada_iddotacion_asignada =iddotacion
  6.     inner join calendario_evaluacion on idcalendario_evaluacion = Calendario_Evaluacion_idCalendario_Evaluacion
  7.     where
  8.     activo = 1
  9.     and year_carga = (select year(now()))
  10.     and mes_carga= (select max(mes_carga) from dotacion where year_carga=(select year(now())))
  11.     group by sesion_id, nro_ciclo) t1
  12.     group by t1.nro_ciclo, t1.supervisor

y esto me hace el calculo perfecto y me trae los datos de la siguiente manera


E. Cancino 53.6 1
J. Santander 49.6 1
E. Cancino 50.0 2
J. Santander 54.3 2
J. Santander 28.5 3
J. Santander 55.0 4

he aqui mi ploblema ya que necesito motrar los datos de manera horizontal
asi
NOMBRE Ciclo Nota1 Nota2 Nota3 Nota4
E. Cancino 1 53.6 50.0 0 0
J. Santander 1 49.6 54.3 28.5 55.0

y es aqui donde aplico la primera consulta que deje arriba pero me muestra los datos como aparecen en el post inicial.

nose si me explique bien o deje mas claro el problema?

de antemano gracias
  #5 (permalink)  
Antiguo 09/03/2012, 12:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Duda sobre if en mysql

Y probaste lo que te puse de código??? no es lo que necesitas???

De la manera en que estás obteniendo el promedio (utilizando AVG) no te va a servir, pues va a obtener el promedio DE TODOS LOS REGISTROS, es por eso que en la consulta te te propongo se obtiene por un lado la suma para cada ciclo y a la vez cuantos ciclos se están contabilizando... para obtener el promedio dividimos estos dos resultados...

Entonces cuál es el problema con la consulta???

Saludos
Leo.
  #6 (permalink)  
Antiguo 09/03/2012, 12:52
 
Fecha de Ingreso: diciembre-2008
Mensajes: 88
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Duda sobre if en mysql

Cita:
Iniciado por leonardo_josue Ver Mensaje
Y probaste lo que te puse de código??? no es lo que necesitas???

De la manera en que estás obteniendo el promedio (utilizando AVG) no te va a servir, pues va a obtener el promedio DE TODOS LOS REGISTROS, es por eso que en la consulta te te propongo se obtiene por un lado la suma para cada ciclo y a la vez cuantos ciclos se están contabilizando... para obtener el promedio dividimos estos dos resultados...

Entonces cuál es el problema con la consulta???

Saludos
Leo.
Leo en primera instancia pense que no me habias entendido pero ahora probe el codigo que me dejaste y funciono perfecto exacto como lo necesitaba enserio demasiadas gracias, estaba hace una semana trabajando ese codigo, muchas gracias. igual dejo el codigo final como lo deje por si a otro usuario le sive.



Código MySQL:
Ver original
  1. * *  supervisor,
  2. * *  SUM(IF(t2.nro_ciclo = 1, t2.promedio, 0)) total1,
  3. * *  SUM(IF(t2.nro_ciclo = 1, 1, 0)) *nota1,
  4. * *  SUM(IF(t2.nro_ciclo = 2, t2.promedio, 0)) total2,
  5. * *  SUM(IF(t2.nro_ciclo = 2, 1, 0)) *nota2,
  6. * *  SUM(IF(t2.nro_ciclo = 3, t2.promedio, 0)) total3,
  7. * *  SUM(IF(t2.nro_ciclo = 3, 1, 0)) *nota3,
  8.      SUM(IF(t2.nro_ciclo = 4, t2.promedio, 0)) total4,
  9. * *  SUM(IF(t2.nro_ciclo = 4, 1, 0)) *nota4
  10. * *  FROM
  11.     (
  12.     select t1.supervisor,ROUND(avg(t1.nota_final),1) as promedio, t1.nro_ciclo
  13.     from (select nombre, nota_final, nro_Ciclo, supervisor
  14.     from dotacion
  15.     inner join evaluacion
  16.     on dotacion_asignada_iddotacion_asignada =iddotacion
  17.     inner join calendario_evaluacion on idcalendario_evaluacion = Calendario_Evaluacion_idCalendario_Evaluacion
  18.     where
  19.     activo = 1
  20.     and year_carga = (select year(now()))
  21.     and mes_carga= (select max(mes_carga) from dotacion where year_carga=(select year(now())))
  22.     group by sesion_id, nro_ciclo) t1
  23.     group by t1.nro_ciclo, t1.supervisor) t2
  24. * *  GROUP BY supervisor;

Etiquetas: join, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:16.