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

Trasponer resultados de una consulta

Estas en el tema de Trasponer resultados de una consulta en el foro de Mysql en Foros del Web. Resulta que tengo una tabla con los siguientes datos y deseo hacer una consulta para trasponer los resultados: idlibro | idcampo | valor 1 | ...
  #1 (permalink)  
Antiguo 27/08/2012, 17:10
Avatar de aovalle  
Fecha de Ingreso: junio-2002
Ubicación: Bogotá, Colombia
Mensajes: 54
Antigüedad: 21 años, 10 meses
Puntos: 0
Trasponer resultados de una consulta

Resulta que tengo una tabla con los siguientes datos y deseo hacer una consulta para trasponer los resultados:

idlibro | idcampo | valor
1 | 1 | La iliada
1 | 2 | Homero
2 | 1 | Cien años de soledad
2 | 2 | García Márquez, Gabriel
3 | 1 | Constitución Política
3 | 2 | Sin autor

Lo que deseo obtener en la consulta es algo como esto:

Idlibro | idcampo (1) | idcampo (2)
1 | La iliada | Homero
2 | Cien años de soledad | García Márquez, Gabriel
3 | Constitución Política | Sin autor

Es esto posible?

Cabe anotar que yo entiendo que ese no es el planteamiento de una tabla para libros, pero este es el diseño de una tabla de un sistema mas grande, solamente que cambié los valores para facilitar la explicación de lo que tengo y lo que deseo obtener.

Para todos los que me puedan dar una ayuda, gracias anticipadas!
  #2 (permalink)  
Antiguo 27/08/2012, 18:06
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años
Puntos: 19
Respuesta: Trasponer resultados de una consulta

Lo que podrias hacer es una funcion o procedimiento en el cual concatenes el nombre a mostrar cuando tengan el mismo idlibro en comun, recorres la consulta con un cursor.
  #3 (permalink)  
Antiguo 27/08/2012, 20:51
Avatar de gerardo_goh  
Fecha de Ingreso: noviembre-2008
Mensajes: 107
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Trasponer resultados de una consulta

que tal: Por que no intentas con la funcion de group_concat:
Te pongo un ejemplo de huesos52, por si las dudas te pongo el link.
http://www.forosdelweb.com/3015306-post16.html

Código MySQL:
Ver original
  1. mysql> CREATE TABLE persona_deporte(persona VARCHAR(20),deporte VARCHAR(20));
  2. Query OK, 0 rows affected (0.06 sec)
  3.  
  4. mysql> INSERT INTO persona_deporte VALUES('Daniel','Futbol');
  5. Query OK, 1 row affected (0.00 sec)
  6.  
  7. mysql> INSERT INTO persona_deporte VALUES('Daniel','Baloncesto');
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> INSERT INTO persona_deporte VALUES('Daniel','valley ball');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> INSERT INTO persona_deporte VALUES('Juan','Tennis');
  14. Query OK, 1 row affected (0.00 sec)
  15.  
  16. mysql> INSERT INTO persona_deporte VALUES('Juan','Futbol');
  17. Query OK, 1 row affected (0.00 sec)
  18.  
  19. mysql> INSERT INTO persona_deporte VALUES('Santiago','Waterpolo');
  20. Query OK, 1 row affected (0.00 sec)
  21.  
  22. mysql> INSERT INTO persona_deporte VALUES('Santiago','Baloncesto');
  23. Query OK, 1 row affected (0.00 sec)
  24.  
  25. mysql> SELECT *FROM persona_deporte;
  26. +----------+-------------+
  27. | persona  | deporte     |
  28. +----------+-------------+
  29. | Daniel   | Futbol      |
  30. | Daniel   | Baloncesto  |
  31. | Daniel   | valley ball |
  32. | Juan     | Tennis      |
  33. | Juan     | Futbol      |
  34. | Santiago | Waterpolo   |
  35. | Santiago | Baloncesto  |
  36. +----------+-------------+
  37. 7 rows IN SET (0.00 sec)
  38.  
  39. mysql> SELECT persona,group_concat(deporte separator " - ") deportes FROM persona_deporte GROUP BY persona;
  40. +----------+-----------------------------------+
  41. | persona  | deportes                          |
  42. +----------+-----------------------------------+
  43. | Daniel   | Futbol - Baloncesto - valley ball |
  44. | Juan     | Tennis - Futbol                   |
  45. | Santiago | Waterpolo - Baloncesto            |
  46. +----------+-----------------------------------+
  47. 3 rows IN SET (0.00 sec)

Espero que esto es lo que buscas, Saludos!!!
  #4 (permalink)  
Antiguo 28/08/2012, 08:36
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Trasponer resultados de una consulta

Hola aovalle:

Suponiendo que en realidad sólo tienes un par de registros para cada "libro" podrías hacerlo con subconsultas, será más o menos así

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +---------+---------+------------------------+
  3. | idlibro | idcampo | valor                  |
  4. +---------+---------+------------------------+
  5. |       1 |       1 | La iliada              |
  6. |       1 |       2 | Homero                 |
  7. |       2 |       1 | Cien años de soledad   |
  8. |       2 |       2 | Garcia Marquez, Gabriel|
  9. |       3 |       1 | Constitucion Politica  |
  10. |       3 |       2 | Sin autor              |
  11. +---------+---------+------------------------+
  12. 6 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT T1.idLibro, T1.valor `idcampo (1)`, T2.valor `idcampo (2)`
  15.     -> FROM tabla T1
  16.     ->   INNER JOIN
  17.     ->   ( SELECT idLibro, valor
  18.     ->     FROM tabla WHERE idcampo = 2) T2
  19.     ->   ON T1.idLibro = T2.idLibro
  20.     -> WHERE idcampo = 1;
  21. +---------+----------------------+-------------------------+
  22. | idLibro | idcampo (1)          | idcampo (2)             |
  23. +---------+----------------------+-------------------------+
  24. |       1 | La iliada            | Homero                  |
  25. |       2 | Cien años de soledad | Garcia Marquez, Gabriel |
  26. |       3 | Constitucion Politica| Sin autor               |
  27. +---------+----------------------+-------------------------+
  28. 3 rows in set (0.00 sec)

La idea es hacer un doble JOIN sobre la misma tabla... una sólo para los elementos con idcampo = 1 y otra para los elementos con idcampo = 2...

Te repito que esta solución es válida considerando que sólo se tienen dos elementos por cada "libro" y que cada idLibro tiene los dos registros... cualquier cambio en este supuesto cambiaría la consulta.

Saludos
Leo.
  #5 (permalink)  
Antiguo 30/08/2012, 16:42
Avatar de aovalle  
Fecha de Ingreso: junio-2002
Ubicación: Bogotá, Colombia
Mensajes: 54
Antigüedad: 21 años, 10 meses
Puntos: 0
Respuesta: Trasponer resultados de una consulta

Hola,

En principio la respuesta que mas me sirve es la de leonardo_josue (Muchas gracias!!), sin embargo con las otras respuestas también he aprendido algunas cosas.

leonardo_josue escribió que la consulta es funcional siempre que los libros tengan los dos valores (autor y título), ahora me queda la duda de que pasaría si alguno de los valore no existiese?. Cómo podría ser el planteamiento de la consulta?

Nuevamente gracias anticipadas!
  #6 (permalink)  
Antiguo 31/08/2012, 08:45
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Trasponer resultados de una consulta

Hola de nuevo aovalle:

como te comenté, la consulta estaba planteada siempre que existieran los valores para cada libro, veamos cómo sería el planteamiento si falta alguno de los dos... partiendo de que son dos atributos los que tienes tenemos tres combinaciones posibles.

primero, que tenga los dos atributos (Autor y Título)
segundo, que tenga sólo Autor
tercero, que tenga sólo título.

hay un cuarto estado, que sería que no tuviera ninguno de los atributos, pero para estos casos simplemente no debería aparecer en la tabla...

Si quieres plantear la consulta como lo estoy haciendo, es decir, con dos subconsultas y manejándolas como si se trataran de dos tablas diferentes, en realidad lo que tendrías que hacer es un FULL OUTER JOIN, lamentablemente MySQL no cuenta con este tipo de unión, pero puedes simularlo de varias maneras... Checa esta liga:

http://luauf.com/2008/07/01/como-sim...join-en-mysql/

Observa que la manera de simular un FULL OUTER JOIN es con dos consultas y un UNION... las consultas son muy similares, pero en una utilizas un LEFT JOIN (en lugar del INNER JOIN) y en la otra RIGTH JOIN...

Cabe recordar que el INNER JOIN requiere que existan elementos en ambas tablas que estás uniendo para regresar resultados, es por eso que en el ejemplo que puse especificaba que hacía el supuesto de que existian ambos atributos para cada libro...

Haz la prueba, trata de implementar el FULL OUTER JOIN a partir de la consulta que puse, cambiando el INNER por LEFT o RIGTH, y si tienes problemas lo comentas y lo revisamos.

Saludos
Leo.

Etiquetas: resultados, tabla, campos
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 22:12.