Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-05-2015
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 233
Poder: 14
darkamerico Va por buen camino
Wink Problema Con Sql De 1 Tabla

Saludos amigos, no soy tan bueno en SQL, tengo una tabla con la siguiente estructura:

Código SQL [-]
CREATE TABLE `postulante_puntaje` (
  `id_postulantenota` int(11) NOT NULL,
  `idexamen_fk` int(11) DEFAULT NULL,
  `idescuela_fk` int(11) DEFAULT NULL,
  `cod_postulante` varchar(10) DEFAULT NULL,
  `dni` char(8) DEFAULT NULL,
  `puntaje` varchar(8) DEFAULT NULL,
  PRIMARY KEY (`id_postulantenota`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Esa tabla almacena los puntajes de los examenes que dan los alumnos del Centro Pre Universitario, normalmente para ingresar los alumnos rinden 4 examenes.

tomemos como ejemplo los siguientes registros:

Código SQL [-]
INSERT INTO `postulante_puntaje` VALUES ('1', '1', '5', '035751', '77393424', '36.4348');

Aqui dice por ejemplo que el alumno identificado con documento nacional de identidad (cedula o dni): 77393424, obtuve una calificacion de 36.4348 en el examen nro 1 (la segunda columna especifica el numero del examen, 1,2,3 o 4). Ahora bien, yo necesito un sql que arroje lo siguiente:

NRO DNI EXAMEN1 EXAMEN2 EXAMEN3 EXAMEN4 PROMEDIO

Agradezco infinitamente la ayuda que puedan brindarme.


Muchas Gracias
Responder Con Cita
  #2  
Antiguo 12-05-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
hola,
puedes hacer varias cosas, pero siempre deberás agrupar po dni si quieres mostrarlo en una sola fila.

Supongo que usas mysql por la definición de la tabla, y no sé si soportará esto.

Opción A: sacar todo de la tabla
Opción B: hacer uniones con la tabla y consigo misma para extraer la información.

Para que veas cómo puedes hacerlo, y steniendo en cuenta que tu motor de sql puede variar algunas clausulas.
Código SQL [-]
select DNI, 
max( case idexamen_fk = 1 then puntaje else 0 end ) as EXAMEN_1,
max( case idexamen_fk = 2 then puntaje else 0 end ) as EXAMEN_2,
max( case idexamen_fk = 3 then puntaje else 0 end ) as EXAMEN_3,
max( case idexamen_fk = 4 then puntaje else 0 end ) as EXAMEN_4

FROM POSTULANTE_PUNTAJE

GROUP BY DNI

Podrías utilizar esta consulta para unirla con las demás tablas ( datos de usuario, nombre examen...)

El gran inconveniente es que si añades examenes, tendrías que cambiar la consulta.
Prueba y nos dices.

Espero que te haya ayudado.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
Antiguo 12-05-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
O usar un procedimiento almacenado en la base de datos.
Responder Con Cita
  #4  
Antiguo 12-05-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
O usar un procedimiento almacenado en la base de datos.
También...

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 12-05-2015
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 233
Poder: 14
darkamerico Va por buen camino
Thumbs up Saludos amigos

Después de mucho padecer, llegue a un sql como el siguiente:

Código SQL [-]
SELECT postulante_puntaje.dni, postulante_puntaje.idescuela_fk, postulante_puntaje.puntaje as p1,
(SELECT postulante_puntaje.puntaje
FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 2 AND
      postulante_puntaje.dni = '74360500') as p2,
(SELECT postulante_puntaje.puntaje
 FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 3 AND
      postulante_puntaje.dni = '74360500') as p3,
(SELECT postulante_puntaje.puntaje
FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 4 AND
      postulante_puntaje.dni = '74360500') as p4
FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 1 AND
      postulante_puntaje.dni = '74360500'

Quizas no sea la consulta mas inteligente que haya hecho, pero al menos funciona, si hubieran sugerencias para mejorarla, seria muy interesante.

Saludos
Responder Con Cita
  #6  
Antiguo 13-05-2015
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Pero eso sólo saca los datos de una persona, no?

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 13-05-2015
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Cita:
Empezado por darkamerico Ver Mensaje
Después de mucho padecer, llegue a un sql como el siguiente:

Código SQL [-]
SELECT postulante_puntaje.dni, postulante_puntaje.idescuela_fk, postulante_puntaje.puntaje as p1,
(SELECT postulante_puntaje.puntaje
FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 2 AND
      postulante_puntaje.dni = '74360500') as p2,
(SELECT postulante_puntaje.puntaje
 FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 3 AND
      postulante_puntaje.dni = '74360500') as p3,
(SELECT postulante_puntaje.puntaje
FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 4 AND
      postulante_puntaje.dni = '74360500') as p4
FROM postulante_puntaje
WHERE postulante_puntaje.idexamen_fk = 1 AND
      postulante_puntaje.dni = '74360500'

Quizas no sea la consulta mas inteligente que haya hecho, pero al menos funciona, si hubieran sugerencias para mejorarla, seria muy interesante.

Saludos
una forma de simplificar, o por lo menos que sea un poco mas legible esta consulta podría ser esta:

Código SQL [-]
SELECT p1.dni, p1.idescuela_fk, p1.puntaje as p1, p2.puntaje, p3.puntaje, p4.puntaje
FROM postulante_puntaje p1
LEFT JOIN postulante_puntaje p2 ON p2.idexamen_fk = 2 and p2.dni = p1.dni and p2.idescuela_fk=p1.idescuela_fk
LEFT JOIN postulante_puntaje p3 ON p3.idexamen_fk = 3 and p3.dni = p1.dni and p3.idescuela_fk=p1.idescuela_fk
LEFT JOIN postulante_puntaje p4 ON p4.idexamen_fk = 4 and p4.dni = p1.dni and p4.idescuela_fk=p1.idescuela_fk
WHERE p1.idexamen_fk = 1 AND
      p1.dni = '74360500'

En principio si se garantiza que ya están insertadas las cuatro notas, en vez de realizar la agrupación de las tablas con LEFT JOIN se puede realizar con INNER JOIN y la consulta se ejecutara mas rápido en el servidor, pero si no es posible garantizar este punto, entonces se utilizara el LEFT JOIN o de lo contrario no devolverá los resultados que les falte alguna de las notas


saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con Stored Procedure para actualizar tabla con datos de otra tabla. Adrian Murua MySQL 4 04-02-2012 02:54:49
Problema Con Una Tabla CHALS Varios 8 30-01-2008 19:17:30
Problema con tabla silviodp Conexión con bases de datos 12 24-09-2005 20:12:49
problema con una tabla zyndy Varios 1 05-01-2005 01:04:34
Problema con tabla .dbf JODELSA Conexión con bases de datos 3 11-07-2003 20:37:27


La franja horaria es GMT +2. Ahora son las 23:55:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi