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

[SOLUCIONADO] agrupar valores similares dentro de una fila

Estas en el tema de agrupar valores similares dentro de una fila en el foro de Mysql en Foros del Web. Buenas noches amigos, tengo una tabla de la siguiente forma id R1 R2 R3 R4 R5 1 1 1 2 5 5 2 5 1 ...
  #1 (permalink)  
Antiguo 01/02/2013, 19:25
 
Fecha de Ingreso: septiembre-2007
Mensajes: 120
Antigüedad: 17 años, 1 mes
Puntos: 0
agrupar valores similares dentro de una fila

Buenas noches amigos, tengo una tabla de la siguiente forma

id R1 R2 R3 R4 R5
1 1 1 2 5 5
2 5 1 5 3 5
3 5 5 1 3 2

y lo que quiero obtener seria algo asi

ID1 tiene dos 1, un 2 y dos 5
ID2 tiene tres 5, un 1, un 3
ID3 tiene dos 5, un 1, un 2 y un 3


Alguien tiene alguna idea de como hacerlo?? puedo obtener la suma o agrupamiento por columna, la idea es hacerlo por fila
  #2 (permalink)  
Antiguo 02/02/2013, 05:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: agrupar valores similares dentro de una fila

Antes que nada, yo te diría que si esa es una búsqueda frecuente y sobre una base con muchos registros, yo no habría estructurado la tabla de esa manera, la verdad. Tampoco nos dices si es obligatorio hacerlo con la base o puedes usar programación. Tampoco sabemos si los números van del 1 al 5 o pueden ser muchos más. Imaginemos que solo van del 1 al 5, una consulta como esta, te ayudará

Código MySQL:
Ver original
  1. SELECT id, (IF( R1 =1, 1, 0 ) + IF( R2 =1, 1, 0 ) + IF( R3 =1, 1, 0 ) + IF( R4 =1, 1, 0 ) + IF( R5 =1, 1, 0 ))tot1,
  2. (IF( R1 =2, 1, 0 ) + IF( R2 =2, 1, 0 ) + IF( R3 =2, 1, 0 ) + IF( R4 =2, 1, 0 ) + IF( R5 =2, 1, 0 ))tot2,
  3. (IF( R1 =3, 1, 0 ) + IF( R2 =3, 1, 0 ) + IF( R3 =3, 1, 0 ) + IF( R4 =3, 1, 0 ) + IF( R5 =3, 1, 0 ))tot3,
  4. (IF( R1 =4, 1, 0 ) + IF( R2 =4, 1, 0 ) + IF( R3 =4, 1, 0 ) + IF( R4 =4, 1, 0 ) + IF( R5 =4, 1, 0 ))tot4,
  5. (IF( R1 =5, 1, 0 ) + IF( R2 =5, 1, 0 ) + IF( R3 =5, 1, 0 ) + IF( R4 =5, 1, 0 ) + IF( R5 =5, 1, 0 ))tot5
id tot1 tot2 tot3 tot4 tot5
1 2 1 0 0 2
2 1 0 1 0 3
3 1 1 1 0 2
  #3 (permalink)  
Antiguo 07/02/2013, 10:54
 
Fecha de Ingreso: septiembre-2007
Mensajes: 120
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: agrupar valores similares dentro de una fila

Hola Jurena, ciertamente no di detalles completos y tienes razon que no es la mejor forma de haber estructurado la tabla solo que es un proyecto al cual me asignaron para resolver ese problema, no es un sistema que yo realice.

- La consulta es algo que se repetirá constantemente ya que es para graficar esos resultados (porcentaje de 1, porcentaje de 2.....) en un gráfico de pastel cada vez que lo pidan

- los valores son únicamente del 1 al 5 solo que pueden existir por registro 20 veces el valor 1, 10 veces el valor 3 o 13 veces el valor 5 y así variar por cada registro

- se puede resolver por programación pero solo en el caso de .NET (lenguaje que no domino en lo absoluto y por eso también estoy sufriendo con el proyecto)

- la suma de los valores tiene que quedar contenidos de alguna forma para que puedan asignarse al grafico


Gracias por contestar Juarena
  #4 (permalink)  
Antiguo 07/02/2013, 12:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: agrupar valores similares dentro de una fila

Hola zubintro:

Se me ocurren algunas ideas para hacer una consulta un poco más sencilla que la que propone jurena, pero no me queda del todo claro cómo es que necesitas tu información. Veamos este caso, podrías utilizar UNION para hacer una sola tabla donde conviertas las columnas a renglones, y una vez que hagas esto, entonces simplemente hacer un COUNT, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+------+------+------+------+------+
  3. | id   | R1   | R2   | R3   | R4   | R5   |
  4. +------+------+------+------+------+------+
  5. |    1 |    1 |    1 |    2 |    5 |    5 |
  6. |    2 |    5 |    1 |    5 |    3 |    5 |
  7. |    3 |    5 |    5 |    1 |    3 |    2 |
  8. +------+------+------+------+------+------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT id, r valor, COUNT(*) cantidad FROM
  12.     -> (
  13.     -> SELECT id, r1 r FROM tabla
  14.     -> UNION ALL
  15.     -> SELECT id, r2 r FROM tabla
  16.     -> UNION ALL
  17.     -> SELECT id, r3 r FROM tabla
  18.     -> UNION ALL
  19.     -> SELECT id, r4 r FROM tabla
  20.     -> UNION ALL
  21.     -> SELECT id, r5 r FROM tabla) T
  22.     -> GROUP BY id, r;
  23. +------+-------+----------+
  24. | id   | valor | cantidad |
  25. +------+-------+----------+
  26. |    1 |     1 |        2 |
  27. |    1 |     2 |        1 |
  28. |    1 |     5 |        2 |
  29. |    2 |     1 |        1 |
  30. |    2 |     3 |        1 |
  31. |    2 |     5 |        3 |
  32. |    3 |     1 |        1 |
  33. |    3 |     2 |        1 |
  34. |    3 |     3 |        1 |
  35. |    3 |     5 |        2 |
  36. +------+-------+----------+
  37. 10 rows in set (0.00 sec)

De aquí se observa para cada id el valor que poseé y cuántas veces se repite este valor... ahora bien, si esta información la necesitas presentar en un solo registro, separado por comas, podrías utilizar la función GROUP_CONCAT, más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT CONCAT('El id = ', id, ' tiene ',
  2.     -> GROUP_CONCAT(cantidad, ' veces el # ', valor)) campo
  3.     -> FROM
  4.     -> (
  5.     ->   SELECT id, r valor, COUNT(*) cantidad FROM
  6.     ->   (
  7.     ->     SELECT id, r1 r FROM tabla
  8.     ->     UNION ALL
  9.     ->     SELECT id, r2 r FROM tabla
  10.     ->     UNION ALL
  11.     ->     SELECT id, r3 r FROM tabla
  12.     ->     UNION ALL
  13.     ->     SELECT id, r4 r FROM tabla
  14.     ->     UNION ALL
  15.     ->     SELECT id, r5 r FROM tabla
  16.     ->   ) T1
  17.     ->     GROUP BY id, r
  18.     -> ) T2
  19.     -> GROUP BY id;
  20. +-----------------------------------------------------------------------------+
  21. | campo                                                                       |
  22. +-----------------------------------------------------------------------------+
  23. | El id = 1 tiene 2 veces el # 1,1 veces el # 2,2 veces el # 5                |
  24. | El id = 2 tiene 1 veces el # 1,1 veces el # 3,3 veces el # 5                |
  25. | El id = 3 tiene 1 veces el # 1,1 veces el # 2,1 veces el # 3,2 veces el # 5 |
  26. +-----------------------------------------------------------------------------+
  27. 3 rows in set (0.00 sec)

Saludos
Leo.
  #5 (permalink)  
Antiguo 08/02/2013, 10:48
 
Fecha de Ingreso: septiembre-2007
Mensajes: 120
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: agrupar valores similares dentro de una fila

Muchas gracias a los que me ayudaron con sus respuestas. Los dejo el codigo de como termine por agrupar los datos

Código:
SELECT        id_ev_pai, Alumno, Profesor, Escuela, Grado, Grupo, ID, 						
						
SUM(
	CASE WHEN R4 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R26 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R55 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R103 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R6 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R71 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R24 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R99 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R27 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R48 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R64 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R97 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R29 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R50 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R73 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R90 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R32 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R49 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R77 = 1 THEN 1 ELSE 0 END +
	CASE WHEN R88 = 1 THEN 1 ELSE 0 END
) as Poco_Logrado,					 
SUM (
	CASE WHEN R4 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R26 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R55 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R103 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R6 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R71 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R24 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R99 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R27 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R48 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R64 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R97 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R29 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R50 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R73 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R90 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R32 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R49 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R77 = 2 THEN 1 ELSE 0 END +
	CASE WHEN R88 = 2 THEN 1 ELSE 0 END
) as Medianamente_logrado,
SUM (
	CASE WHEN R4 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R26 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R55 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R103 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R6 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R71 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R24 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R99 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R27 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R48 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R64 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R97 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R29 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R50 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R73 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R90 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R32 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R49 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R77 = 3 THEN 1 ELSE 0 END +
	CASE WHEN R88 = 3 THEN 1 ELSE 0 END
) as Logrado,
SUM (
	CASE WHEN R4 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R26 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R55 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R103 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R6 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R71 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R24 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R99 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R27 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R48 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R64 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R97 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R29 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R50 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R73 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R90 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R32 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R49 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R77 = 4 THEN 1 ELSE 0 END +
	CASE WHEN R88 = 4 THEN 1 ELSE 0 END
) as Pendiente

FROM vw_ev_1ro
group by id_ev_pai, Alumno, Profesor, Escuela, Grado, Grupo, ID

Saludos y gracias nuevamente

Etiquetas: agrupacion
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 16:43.