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

Agrupar columnas con ORDER BY sin perder registros ocultos, interesante!!

Estas en el tema de Agrupar columnas con ORDER BY sin perder registros ocultos, interesante!! en el foro de Mysql en Foros del Web. Buenas!!!! Estoy haciendo un sistema de reportes para una universidad, en la que me proporcionan la base de datos ya con los registros. La tabla ...
  #1 (permalink)  
Antiguo 30/07/2012, 06:10
Avatar de lordofsol  
Fecha de Ingreso: julio-2011
Ubicación: Campeche Mexico
Mensajes: 4
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Agrupar columnas con ORDER BY sin perder registros ocultos, interesante!!

Buenas!!!!

Estoy haciendo un sistema de reportes para una universidad, en la que me proporcionan la base de datos ya con los registros.

La tabla que me interesa esta mas o memos así:

id_alumno | nombre | periodo | title | grde | programa
232323 - Miguel Soler - 20060 - Algebra - 7 - ing. en Sistemas
232323 - Miguel Soler - 20060 - Español - 8 - ing. en Sistemas
232323 - Miguel Soler - 20040 - Etica - 10 - ing. en Sistemas

343434 - Pedro Perez - 20060 - Algebra - 6 - ing. en Sistemas
343434 - Pedro Perez - 20060 - Español - 8 - ing. en Sistemas
343434 - Pedro Perez - 20040 - Etica - 9 - ing. en Sistemas

454545 - Oscar Lopez - 20060 - Algebra - 10 - ing. en Sistemas
454545 - Oscar Lopez - 20060 - Español - 9 - ing. en Sistemas
454545 - Oscar Lopez - 20040 - Etica - 10 - ing. en Sistemas

787878 - Lupe Meza - 20060 - Admin - 10 - Admon de Empresas
787878 - Lupe Meza - 20060 - Español - 9 - iAdmon de Empresas
787878 - Lupe Meza - 20020 - Etica II - 10 - Admon de Empresas

Donde Title es el nombre de la materia y grde la calificación.

En PHP genero un reporte en Excel, obviamente los registros son por cada materia , y en la BD estan los alumnos de todas las carreras.

al momento de hacer un reporte de la carrera de ingenieria hago lo sig:

Mi tabla se llama "records"

Código PHP:
$colsulta=mysql_query("SELECT id_alumno,nombre,title,grde FROM records WHERE periodo = '20060' AND programa = 'ing. en Sistemas' ); 
Y aqui empieza el dilema:

esta consulta me arroja:

ID | Nombre | Materia| Calific. Final
232323 - Miguel Soler - Algebra - 7
232323 - Miguel Soler - Español - 8

343434 - Pedro Perez - Algebra - 6
343434 - Pedro Perez - Español - 8

454545 - Oscar Lopez - Algebra - 10
454545 - Oscar Lopez - Español - 9

Pero en la tabla necesito que me muestre el nombre una sola vez.

Si le pongo un ORDER BY ó un DISTINCT por nombre, me seleccionara solamente el primer registro de cada nombre que se repita, osea que solo vere en la tabla los tres nombres y Algebra con su respectiva Calificacion.

Y lo que quiero mostrar es como el historial academico, segun el periodo que selecicones, algo asi:

ID | NOmbre | Algebra | Español
232323 - Miguel Soler - 7 - 8
343434 - Pedro Perez - 6 - 8
454545 - Oscar Lopez - 10 - 9

Esto seria un reporte de solo el periodo "20060" de la carrera de "ing. en Sistemas" según el ejemplo que puse, si seleccionara el periodo "20040" En materia, únicamente me debería mostrar "Ética".

Espero me haya explicado bien, lo trate de xplicar de la mejor manera que pude para que me entiendan.

Necesito que me muestre el nombre una sola vez pero sin que la colsulta me ignore el resto de las filas que tienen el mismo nombre, ya que los necesito, es donde estan los nombre de las demas materias y sus respectivas calificaciones.
  #2 (permalink)  
Antiguo 30/07/2012, 07:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Agrupar columnas con ORDER BY sin perder registros ocultos, interesante!!

Probemos con esto:
Código MySQL:
Ver original
  1.     id_alumno,
  2.     nombre,
  3.     title,
  4.     grde
  5. FROM    records
  6. WHERE   periodo = '20060'
  7.     AND programa = 'ing. en Sistemas'
  8.     id_alumno, nombre WITH ROLLUP;

O bien:
Código MySQL:
Ver original
  1.     id_alumno,
  2.     nombre,
  3.     title,
  4.     grde
  5. FROM    records
  6. WHERE   periodo = '20060'
  7.     AND programa = 'ing. en Sistemas'
  8.     nombre ASC, id_alumno WITH ROLLUP;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 31/07/2012, 05:33
Usuario no validado
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 16
Respuesta: Agrupar columnas con ORDER BY sin perder registros ocultos, interesante!!

Muy interesante ese "WITH_ROLLUP" que mencionó gnzsoloyo. No tenía ni idea de que eso existiese.

En fin.

Creo entender mejor el problema que plantea lordofsol. Usualmente me ha tocado resolverlo a nivel de programación al momento de mostrar los resultados en una aplicación para usuarios finales, o para una página web antes de generar el HTML que muestra el resultado, pero nunca desde el "select".

A partir de los datos publicados, me he montado una tabla de pruebas y he escrito un query para conseguir lo que pretende lordofsol. O al menos eso creo.

Código MySQL:
Ver original
  1. CREATE TABLE  fdw_example1 (
  2.   Id_Alumno int(10) NOT NULL,
  3.   Nombre varchar(255) DEFAULT '',
  4.   Periodo int(10) NOT NULL,
  5.   Title varchar(30) NOT NULL,
  6.   Grde tinyint NOT NULL,
  7.   Programa varchar(60) NOT NULL,
  8.   PRIMARY KEY (Id_ITEM)
  9.  
  10. insert into fdw_example1 (Id_Alumno, Nombre, Periodo, Title, Grde, Programa) values
  11. (232323, 'Miguel Soler', 20060, 'Algebra', 7, 'ing. en Sistemas'),
  12. (232323, 'Miguel Soler', 20060, 'Español', 8, 'ing. en Sistemas'),
  13. (232323, 'Miguel Soler', 20040, 'Etica', 10, 'ing. en Sistemas'),
  14.  
  15. (343434, 'Pedro Perez', 20060, 'Algebra', 6, 'ing. en Sistemas'),
  16. (343434, 'Pedro Perez', 20060, 'Español', 8, 'ing. en Sistemas'),
  17. (343434, 'Pedro Perez', 20040, 'Etica', 9, 'ing. en Sistemas'),
  18.  
  19. (454545, 'Oscar Lopez', 20060, 'Algebra', 10, 'ing. en Sistemas'),
  20. (454545, 'Oscar Lopez', 20060, 'Español', 9, 'ing. en Sistemas'),
  21. (454545, 'Oscar Lopez', 20040, 'Etica', 10, 'ing. en Sistemas'),
  22.  
  23. (787878, 'Lupe Meza', 20060, 'Admin', 10, 'Admon de Empresas'),
  24. (787878, 'Lupe Meza', 20060, 'Español', 9, 'Admon de Empresas'),
  25. (787878, 'Lupe Meza', 20020, 'Etica II', 10, 'Admon de Empresas');
  26.  
  27.  
  28. SELECT  case a.Title when x.Min_Title then  a.Id_Alumno else '' end as Id_Alumno,
  29.         case a.Title when x.Min_Title then  a.Nombre else '' end as Nombre,
  30.         a.Title,
  31.         a.Grde
  32. FROM fdw_example1 a
  33. inner join (  select Id_Alumno, min(Title) as Min_Title
  34.               from fdw_example1
  35.               where Periodo = '20060' and Programa = 'ing. en Sistemas'
  36.               group by Id_Alumno
  37.           ) as x on x.Id_Alumno = a.Id_Alumno
  38. WHERE a.periodo = '20060' AND a.programa = 'ing. en Sistemas'
  39. order by a.Nombre, a.Title;

Resultado:

Código SQL:
Ver original
  1. +-----------+---------------+-------+-------+    
  2. |Id_Alumno  |Nombre         |Title  |Grde   |
  3. +-----------+---------------+-------+-------+
  4. |232323     |Miguel Soler   |Algebra|7      |
  5. +-----------+---------------+-------+-------+
  6. |           |               |Español|8      |
  7. +-----------+---------------+-------+-------+
  8. |454545     |Oscar Lopez    |Algebra|10     |
  9. +-----------+---------------+-------+-------+
  10. |           |               |Español|9      |
  11. +-----------+---------------+-------+-------+
  12. |343434     |Pedro Perez    |Algebra|6      |
  13. +-----------+---------------+-------+-------+
  14. |           |               |Español|8      |
  15. +-----------+---------------+-------+-------+



[(Que alguien me explique como poner una "tablita" en un mensaje del foro porque no he encontrado como hacer que el resultado se vea decentemente).

Gracias a gnzsoloyo por responder a esta duda de "la tablita".]


Cuenta si era esto lo que querías.

Saludos,

PCID.

PD:
Una nota más:
Con SQL, "poder hacer" no implica salvar la barrera de "no se debe hacer".

Última edición por pcid; 31/07/2012 a las 09:26

Etiquetas: agrupar, columnas, order, perder, php, registros, select, sql, tabla
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 23:18.