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

Ayuda con Select count complejo

Estas en el tema de Ayuda con Select count complejo en el foro de Mysql en Foros del Web. Buenas a todos alguien pudiera ayudarme con un select que necesito hacer de la siguiente tabla la tabla esta en mysql. Necesito contar todos los ...
  #1 (permalink)  
Antiguo 16/03/2011, 09:00
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 14 años
Puntos: 0
Busqueda Ayuda con Select count complejo

Buenas a todos
alguien pudiera ayudarme con un select que necesito hacer de la siguiente tabla



la tabla esta en mysql.
Necesito contar todos los ceros o unos de los campos D1 hasta el D31 filtrando por codigo de categoria 1,2,3

ej: cuantos 0 hay en la categoría 1 dentro de los campos D1 a D31

e probado varias opciones de select count(*) y no e podido obtener el resultado correcto.
Por favor alguien que se maneje en este tipo de query me ayude se lo agradecería


Saludos!
  #2 (permalink)  
Antiguo 16/03/2011, 09:35
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: Ayuda con Select count complejo

No puedes hacer eso con una consulta. DEberías hacelo programátiamente.
Para hacerlo en una consulta los campos D1 a D31 deberían ser en realidad registros de una tabla relacionada con la primera, y los valores cero deberían esta representados por registros no existentes (NULL).
__________________
¿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 16/03/2011, 12:21
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con Select count complejo

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No puedes hacer eso con una consulta. DEberías hacelo programátiamente.
Para hacerlo en una consulta los campos D1 a D31 deberían ser en realidad registros de una tabla relacionada con la primera, y los valores cero deberían esta representados por registros no existentes (NULL).
Gracias por tu respuesta. Pero a que te refieres con programátiamente???
  #4 (permalink)  
Antiguo 16/03/2011, 12:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ayuda con Select count complejo

Hola palavicini:

No estoy seguro de si entendí correctamente el problema, pero a ver si esto te sirve:

Código MySQL:
Ver original
  1. mysql> create table Ceros_Unos (CategoriaSEQ int, D1 int, D2 int, D3 int, D4 int
  2. , D5 int);
  3. Query OK, 0 rows affected (0.05 sec)
  4.  
  5. mysql> insert into Ceros_Unos values (1,1,0,0,1,0),(1,1,0,0,1,0),(1,0,0,0,0,0),(
  6. 1,1,1,0,1,1),(2,0,0,0,0,1),(2,0,1,0,0,0),(2,0,0,0,1,1),(3,1,0,0,0,0),(3,0,0,0,1,
  7. 1),(3,0,0,0,0,0);
  8. Query OK, 10 rows affected (0.03 sec)
  9. Records: 10  Duplicates: 0  Warnings: 0
  10.  
  11. mysql> select * from Ceros_Unos;
  12. +--------------+------+------+------+------+------+
  13. | CategoriaSEQ | D1   | D2   | D3   | D4   | D5   |
  14. +--------------+------+------+------+------+------+
  15. |            1 |    1 |    0 |    0 |    1 |    0 |
  16. |            1 |    1 |    0 |    0 |    1 |    0 |
  17. |            1 |    0 |    0 |    0 |    0 |    0 |
  18. |            1 |    1 |    1 |    0 |    1 |    1 |
  19. |            2 |    0 |    0 |    0 |    0 |    1 |
  20. |            2 |    0 |    1 |    0 |    0 |    0 |
  21. |            2 |    0 |    0 |    0 |    1 |    1 |
  22. |            3 |    1 |    0 |    0 |    0 |    0 |
  23. |            3 |    0 |    0 |    0 |    1 |    1 |
  24. |            3 |    0 |    0 |    0 |    0 |    0 |
  25. +--------------+------+------+------+------+------+
  26. 10 rows in set (0.00 sec)
  27.  
  28. mysql> select CategoriaSEQ,
  29.     -> sum(if(D1 = 0, 1, 0))+
  30.     -> sum(if(D2 = 0, 1, 0))+
  31.     -> sum(if(D3 = 0, 1, 0))+
  32.     -> sum(if(D4 = 0, 1, 0))+
  33.     -> sum(if(D5 = 0, 1, 0)) total_ceros,
  34.     -> sum(if(D1 = 1, 1, 0))+
  35.     -> sum(if(D2 = 1, 1, 0))+
  36.     -> sum(if(D3 = 1, 1, 0))+
  37.     -> sum(if(D4 = 1, 1, 0))+
  38.     -> sum(if(D5 = 1, 1, 0)) total_unos
  39.     -> from Ceros_unos
  40.     -> group by CategoriaSEQ;
  41. +--------------+-------------+------------+
  42. | CategoriaSEQ | total_ceros | total_unos |
  43. +--------------+-------------+------------+
  44. |            1 |          12 |          8 |
  45. |            2 |          11 |          4 |
  46. |            3 |          12 |          3 |
  47. +--------------+-------------+------------+
  48. 3 rows in set (0.00 sec)

En el ejemplo sólo pongo 5 columnas, si esto es lo que quieres tendrías que completar con los 31 campos.

En lo que respecta a la respuesta del compañero gnzsoloyo creo que se refiere a que lo hagas con algún lenguaje de programación o en su defecto desde la base de datos, pero utilizando procedimientos almacenados.

Saludos
Leo.
  #5 (permalink)  
Antiguo 16/03/2011, 12:32
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: Ayuda con Select count complejo

PHP, VB, C#, Java, VB.Net, o lo que sea que uses para programar...
__________________
¿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 16/03/2011, 12: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: 16 años, 4 meses
Puntos: 2658
Respuesta: Ayuda con Select count complejo

El problema que le veo a la solución que te propone leonardo_josue, es que es demasiado complicada como sintaxis, y es proclive a los errores de transcripción.
Además, crear una relación específica para eso en otra tabla es lo que corresponde desde el punto de vista del modelo E-R. No tiene sentido hacer una tabla con columnas que guardarán ceros en la mayoría de los casos, o que sólo tienen sentido de existencia si marcan un evento par un día determinado.
Piensa que esa tabla pude ocupar 70 bytes, cuando en realidad para lo mismo sólo se requerirían 6 por cada instancia de ocurrencia. Es un desperdicio de almacenamiento.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 16/03/2011, 13:26
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con Select count complejo

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El problema que le veo a la solución que te propone leonardo_josue, es que es demasiado complicada como sintaxis, y es proclive a los errores de transcripción.
Además, crear una relación específica para eso en otra tabla es lo que corresponde desde el punto de vista del modelo E-R. No tiene sentido hacer una tabla con columnas que guardarán ceros en la mayoría de los casos, o que sólo tienen sentido de existencia si marcan un evento par un día determinado.
Piensa que esa tabla pude ocupar 70 bytes, cuando en realidad para lo mismo sólo se requerirían 6 por cada instancia de ocurrencia. Es un desperdicio de almacenamiento.
gnzsoloyo aprecio mucho tu tiempo y respuestas a mi inquietud y los consejos que das. Pero la verdad señale el tema de realizar una consulta por que no tengo la experiencia como para realizar un PA o un modelo E-R mas complejos para este caso o ya lo hubiera implementado. Agradecería si tienes tiempo me dijeras como abordar el tema programaticamente como me dices, tal vez remitiéndome a algún otro ejemplo. Puedo estar bloqueado a realizarlo solo por Base de datos y no veo como resolverlo por lenguaje. Si dices que la solucion por query no es conveniente entonces como seria por lenguaje?


leonardo_josue gracias por el ejemplo que me diste! lo pruebo y te comento que tal anduvo. Se que no es la solucion ideal como ya se dijo pero necesito solución :S
  #8 (permalink)  
Antiguo 16/03/2011, 13:31
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: Ayuda con Select count complejo

¿Y qué lenguajes de programación vas a usar?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 16/03/2011, 13:34
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con Select count complejo

estoy usando php
  #10 (permalink)  
Antiguo 16/03/2011, 13:56
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: Ayuda con Select count complejo

Este código recorre la tabla registro a registro y columna por columna:

Código PHP:
      $result mysql_query($sql$db);
      If(
$result)
          {
          
$fcount mysql_num_fields($result);
          while(
$row mysql_fetch_array($result) )
              {
              for(
$i=0$i$fcount$i++)
                {
                
$tag mysql_field_name($result$i );
                
// Aquí va el proceso de la columna
                
}
             
// Aquí  va el el proceso del registro
             
}
             
mysql_close();
             } 
$sql es una variable string que contiene la consulta.
$db es la variable de conexión.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 16/03/2011, 15:43
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ayuda con Select count complejo

Hola de nuevo compañer@s...

Estuve pensando en otra solución más óptima, pues como comenta el compañero
gnzsoloyo, la primera resulta bastante complicada de implementar.

después de una buena comida jejeje, se me ocurrió que puedes hacer lo siguiente:

Código MySQL:
Ver original
  1. mysql> select CategoriaSEQ,
  2.     -> sum(5 - (D1 + D2 + D3 + D4 + D5)) total_ceros,
  3.     -> sum(D1 + D2 + D3 + D4 + D5) total_unos
  4.     -> from Ceros_unos
  5.     -> GROUP BY CategoriaSEQ;
  6. +--------------+-------------+------------+
  7. | CategoriaSEQ | total_ceros | total_unos |
  8. +--------------+-------------+------------+
  9. |            1 |          12 |          8 |
  10. |            2 |          11 |          4 |
  11. |            3 |          12 |          3 |
  12. +--------------+-------------+------------+
  13. 3 rows in set (0.00 sec)

Si observas el resultado es el mismo que el que tiene todos los if's y sumas...
Aquí estoy considerando que los campos sólo tienen ceros y unos, si no es así entonces no funcionará.

Sería cuestión de que lo revises. De cualquier manera tal y como lo comentas gnzsoloyo puedes hacerlo mediante programación, pero al tener que utilizar ciclos anidados el rendimiento puede hacerse lento, dependiendo del número de registros que contenga tu tabla. Sería cuestión de que hagas la prueba, ya sea con BD y con Programación y elijas la que tenga mejor performance.

saludos
Leo.
  #12 (permalink)  
Antiguo 17/03/2011, 08:59
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ayuda con Select count complejo

NOTA: Olvidé mencionar que sigo considerando el ejemplo con una tabla de 5 campos, sería cuestión de que incluir los 31 campos y para obtener el total de ceros sería SUM(31 - (D1+D2+......+D31))

Saludos
Leo.
  #13 (permalink)  
Antiguo 18/03/2011, 12:53
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con Select count complejo

Cita:
Iniciado por leonardo_josue Ver Mensaje
NOTA: Olvidé mencionar que sigo considerando el ejemplo con una tabla de 5 campos, sería cuestión de que incluir los 31 campos y para obtener el total de ceros sería SUM(31 - (D1+D2+......+D31))

Saludos
Leo.
Te pasaste leo! Funciona perfecto la ultima sentencia y es mucho mas precisa. te lo agradesco un monton. Ahora la aplico. Saludos

Etiquetas: count, select
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 18:36.