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

Consulta por varios Grupos y conteos

Estas en el tema de Consulta por varios Grupos y conteos en el foro de Mysql en Foros del Web. Hola buen dia compañeros del foro Tengo la siguiente inquietud tengo un sistema de encuestas y tengo la siguiente estructura id | p1 | p2 ...
  #1 (permalink)  
Antiguo 17/01/2012, 10:22
 
Fecha de Ingreso: enero-2012
Ubicación: Mexico Df
Mensajes: 95
Antigüedad: 11 años, 2 meses
Puntos: 6
Consulta por varios Grupos y conteos

Hola buen dia compañeros del foro

Tengo la siguiente inquietud tengo un sistema de encuestas y tengo la siguiente estructura

id | p1 | p2 | p3| p4 | p5 |
1 | r1 | r1 | r3 | r2 | r2 |
2 | r5 | r2 | r5 | r1 | r3 |



asi sucesivamente lo que trato saber es cuantas personas pusieron de la pregunta 1 la respuesta 1 y la respuesta 2 y la respuesta 3. etc.

p1

r1=5;
r2=1
r3=10
r4=5


asi con las demas preguntas tambien, de momento se me ocurrio asi

Código MySQL:
Ver original
  1. sql = SELECT p1,p2,p3,p4, count(p1),count(p2),count(p3),count(p4) FROM encuestas GROUP BY p1,p2,p3,p4

pero no obtengo el resultado deseado
  #2 (permalink)  
Antiguo 17/01/2012, 10:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 15 años, 3 meses
Puntos: 2658
Respuesta: Consulta por varios Grupos y conteos

Probablemente se deba a que COUNT() usado sobre un campo cuenta uno por cada campo no nulo, cosa que no significa que tenga un dato válido.
SI ese campo contiene un 1 por cada voto, y cero(0) si no votó, lo que debes hacer es SUM(), no COUNT().
Por otro lado, si ese campo contiene un valor SI o NO, o cualquier otra cosa, lo que debes hacer es sumar 1 en todos aquellos donde esa condición se cumple.
Como erás, el tema depende de cómo estés guardando los datos.
Supongamos que ea un S/N. La cosa sería:

Código MySQL:
Ver original
  1.   SUM(IF(p1 = 'S', 1, 0)) p1,
  2.   SUM(IF(p2 = 'S', 1, 0)) p2,
  3.   SUM(IF(p3 = 'S', 1, 0)) p3,
  4.   SUM(IF(p4 = 'S', 1, 0)) p4
  5. FROM encuestas
La idea anda por acá, pero no estás explicando muy claramente cómo es la información que guardas, como para ayudarte más.
__________________
¿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 17/01/2012, 11:16
Avatar de totobycrg  
Fecha de Ingreso: enero-2012
Ubicación: México D.F.
Mensajes: 27
Antigüedad: 11 años, 2 meses
Puntos: 5
Respuesta: Consulta por varios Grupos y conteos

puedes probar así

SELECT count(*) FROM encuestas WHERE p1 = 'r1'
SELECT count(*) FROM encuestas WHERE p1 = 'r2'
SELECT count(*) FROM encuestas WHERE p1 = 'r3'
SELECT count(*) FROM encuestas WHERE p1 = 'r4'
SELECT count(*) FROM encuestas WHERE p1 = 'r5'

algo así quieres?
  #4 (permalink)  
Antiguo 17/01/2012, 11:30
 
Fecha de Ingreso: enero-2012
Ubicación: Mexico Df
Mensajes: 95
Antigüedad: 11 años, 2 meses
Puntos: 6
Respuesta: Consulta por varios Grupos y conteos

Hola muchas gracias


:apla uso:

la forma de gnzsoloyo me resulto efectiva no eh provado la forma de totobycrg

la primer forma me resulto muy practica ya que toda va dentro de un solo query lo adapte y obtengo lo deseado que seria lo siguiente

Código MySQL:
Ver original
  1.   SUM(IF(p1 = 'r1', 1, 0)) p1_r1,  #obtengo el total de r1 de p1
  2.   SUM(IF(p1 = 'r2', 1, 0)) p1_r2,  #obtengo el total de r2 de p1
  3.   SUM(IF(p1 = 'r3', 1, 0)) p1_r3,
  4.   SUM(IF(p1 = 'r4', 1, 0)) p1_r4,
  5.   SUM(IF(p2 = 'r1', 1, 0)) p2_r1  #obtengo el total de r1 de p2
  6. FROM resultados_encuesta_recremex

Esta es la forma correcta de hacer estas sumas?

solo una duda ya que me intriiga saber como funciona esta funcion
SUM(IF(p1 = 'r1', 1, 0)
que significa los parametros 1,0 ???
  #5 (permalink)  
Antiguo 17/01/2012, 11:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 15 años, 3 meses
Puntos: 2658
Respuesta: Consulta por varios Grupos y conteos

Cita:
IF(condicion, valor si es TRUE, Valor si es FALSE)
Manual de referencia de MySQL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 11/03/2012, 17:51
 
Fecha de Ingreso: marzo-2012
Mensajes: 1
Antigüedad: 11 años
Puntos: 0
Respuesta: Consulta por varios Grupos y conteos

La opción de gnzsoloyo me resultó efectiva para lo que buscaba, yo debo hacer algo muy parecido y esto es solo un paso :)

Ahora tengo una duda. ¿cómo puedo agregarle el texto de la pregunta a la tabla? Si pongo este código:
Código:
SELECT
      SUM(IF(preg1 = 1, 1, 0)) "r1",
      SUM(IF(preg1 = 2, 1, 0)) "r2",
      SUM(IF(preg1 = 3, 1, 0)) "r3",
      SUM(IF(preg1 = 4, 1, 0)) "r4"
FROM tabla1
UNION
SELECT
      SUM(IF(preg2 = 1, 1, 0)) "r1",
      SUM(IF(preg2 = 2, 1, 0)) "r2",
      SUM(IF(preg2 = 3, 1, 0)) "r3",
      SUM(IF(preg2 = 4, 1, 0)) "r4"
FROM tabla1
UNION....
Obtengo estos resultados
Código:
r1|r2|r3|r4
|2||1||0||0|
|1||2||0||0|
...
Quisiera que el resultado fuera

Código:
preguntas||r1|r2|r3|r4
pregunta1||2||1||0||0|
pregunta2||1||2||0||0|
...
Pero el texto de la pregunta está en otra tabla y para identificar el texto correspondiente hay que unir los campos de dos identificadores, compararlo con el nombre de la columna de la pregunta, en fin... Me parece más fácil poner un texto manualmente aunque no se como hacerlo :(

Y otra cosa, en la tabla que tengo hay casi 40 preguntas, el nombre de la columna de la primer pregunta es "15913X1X11", el de la segunda es "15913X1X12" y así susesivamente. Si hay alguna forma de acortar el código que hay que escribir lo agradecerían mucho mis manos je je je je...

Cualquier ayuda será bien recibida

Etiquetas: grupos, select, 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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:53.