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

Select de una tabla autocruzada de Texto

Estas en el tema de Select de una tabla autocruzada de Texto en el foro de Mysql en Foros del Web. ueno, pues aquí va mi pregunta. Si yo tengo esta tabla creada (que por cierto, creo que se ve horrible puesta así... intenten copiar y ...
  #1 (permalink)  
Antiguo 10/05/2011, 11:17
 
Fecha de Ingreso: febrero-2007
Mensajes: 13
Antigüedad: 17 años, 8 meses
Puntos: 0
Select de una tabla autocruzada de Texto

ueno, pues aquí va mi pregunta. Si yo tengo esta tabla creada (que por cierto, creo que se ve horrible puesta así... intenten copiar y pegar mi texto en GEdit o el Bloc de Notas y se verá mejor..pienso yo):
Código:
mysql> select * from 'tabla';
+------+--------+-----------+--------------+
|  id  | nombre | actividad | dia_semana   |
+------+--------+-----------+--------------+
|    1 | jose   | karate    | lunes        |
|    2 | maria  | ballet    | miercoles    |
|    3 | manuel | plastica  | viernes      |
|    4 | jesus  | futbol    | lunes        |
|    5 | rocio  | ballet    | lunes        |
|    6 | laura  | karate    | miercoles    |
|    7 | sergio | plastica  | viernes      |
|    8 | jorge  | futbol    | lunes        |
+------+--------+-----------+--------------+
8 rows in set (0.00 sec)
y quiero conseguir esto:
Código:
+----------------------+----------------------------------------------+
| actividad/dia_semana | lunes         | miercoles | viernes          |
+----------------------+----------------------------------------------+
| karate               | jose          | laura     |                  |
| ballet               | rocio         | maria     |                  |
| plastica             |               |           | manuel , sergio  |
| futbol               | jesus , jorge |           |                  |
+---------------------------------------------------------------------+
Sabiendo que Siempre en el mismo día y misma actividad, SÓLO concurren 2 niños por actividad, nunca más niños. Pero en un futuro tambien estarán el resto de días de la semana ocupados, no solo esos tres del ejemplo.
yo sólo he conseguido esto:
Código:
mysql> select 'actividad' , if(MAX('nombre')=MIN('nombre') , 'nombre' , CONCAT(MAX('nombre'), ' , ', MIN('nombre'))) AS alumnos
-> FROM 'tabla'
-> GROUP BY 'actividad';
+----------------+----------------+
| actividad      | alumnos        |
+----------------+----------------+
| karate         | jose , laura   |
| ballet         | rocio , maria  |
| plastica       | manuel, sergio |
| futbol         | jesus , jorge  |
+----------------+----------------+
4 rows in set (0.00 sec)
Espero puedan ayudarme, mil gracias.
  #2 (permalink)  
Antiguo 10/05/2011, 12:46
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Select de una tabla autocruzada de Texto

Hola SadlyMistaken:

Lo que quieres hacer se puede obtener utilizando la función GROUP_CONCAT y utilizando subconsultas, así:

Código MySQL:
Ver original
  1. mysql> create table tabla (
  2.     -> id int, nombre varchar(20),
  3.     -> actividad varchar(20), dia_semana varchar(20));
  4. Query OK, 0 rows affected (0.08 sec)
  5.  
  6. mysql> insert into tabla values (1,'jose','karate','lunes'),
  7.     -> (2,'maria','ballet','miercoles'),
  8.     -> (3,'manuel','plastica','viernes'),
  9.     -> (4,'jesus','futbol','lunes'),
  10.     -> (5,'rocio','ballet','lunes'),
  11.     -> (6,'laura','karate','miercoles'),
  12.     -> (7,'sergio','plastica','viernes'),
  13.     -> (8,'jorge','futbol','lunes');
  14. Query OK, 8 rows affected (0.05 sec)
  15. Records: 8  Duplicates: 0  Warnings: 0
  16.  
  17. mysql> select * from tabla;
  18. +------+--------+-----------+------------+
  19. | id   | nombre | actividad | dia_semana |
  20. +------+--------+-----------+------------+
  21. |    1 | jose   | karate    | lunes      |
  22. |    2 | maria  | ballet    | miercoles  |
  23. |    3 | manuel | plastica  | viernes    |
  24. |    4 | jesus  | futbol    | lunes      |
  25. |    5 | rocio  | ballet    | lunes      |
  26. |    6 | laura  | karate    | miercoles  |
  27. |    7 | sergio | plastica  | viernes    |
  28. |    8 | jorge  | futbol    | lunes      |
  29. +------+--------+-----------+------------+
  30. 8 rows in set (0.00 sec)
  31.  
  32. mysql> select distinct actividad,
  33.     -> ifnull((select group_concat(nombre) from tabla T2
  34.     -> where T2.actividad = T1.actividad
  35.     -> and T2.dia_semana = 'lunes'), '') Lunes,
  36.     -> ifnull((select group_concat(nombre) from tabla T2
  37.     -> where T2.actividad = T1.actividad
  38.     -> and T2.dia_semana = 'miercoles'), '') Miercoles,
  39.     -> ifnull((select group_concat(nombre) from tabla T2
  40.     -> where T2.actividad = T1.actividad
  41.     -> and T2.dia_semana = 'viernes'), '') Viernes
  42.     -> from tabla T1;
  43. +-----------+-------------+-----------+---------------+
  44. | actividad | Lunes       | Miercoles | Viernes       |
  45. +-----------+-------------+-----------+---------------+
  46. | karate    | jose        | laura     |               |
  47. | ballet    | rocio       | maria     |               |
  48. | plastica  |             |           | manuel,sergio |
  49. | futbol    | jesus,jorge |           |               |
  50. +-----------+-------------+-----------+---------------+
  51. 4 rows in set (0.02 sec)

Hasta donde recuerdo MySQL no implementa tablas PIVOT, como SQL Server u Oracle (igual y estoy equivocado), sería cuestión de que investigaras algo más acerca de este tema.

Checa esta liga:

http://www.artfulsoftware.com/infotree/queries.php#78

Saludos
Leo.

Última edición por leonardo_josue; 10/05/2011 a las 12:52
  #3 (permalink)  
Antiguo 10/05/2011, 16:11
 
Fecha de Ingreso: febrero-2007
Mensajes: 13
Antigüedad: 17 años, 8 meses
Puntos: 0
Respuesta: Select de una tabla autocruzada de Texto

¡¡¡¡La Virgen!!!!! ¡¡¡Qué rápido y eficaz!!!!

¡¡¡Millones de Gracias!!!
Y yo estaba volviendome loco con los CASE.. y cosas así ya no sabía que probar
pero es que yo no conocia
- DISTINCT
- CONCAT_GROUP
- SELECT ENCADENADOS, NI ANIDADOS
- IFNULL

vamos, que soy un novato xD jajaja Mil gracias, de verdad.
  #4 (permalink)  
Antiguo 11/05/2011, 11:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Select de una tabla autocruzada de Texto

De nada, me dio gusto que te sirviera el código...

Como verás hay mucho que aprender de mySQL y los distintos manejadores de BD, por lo que te recomiendo que sigas leyendo y que utilices los foros no simplemente para resolver algún problema que tengas, lee todos los post aunque no participes en ellos, te aseguro que más de uno te servirá para aprender cosas nuevas.

Saludos
Leo.

Etiquetas: auto, cruzadas, sql
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 20:45.