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

Contar en una misma tabla los campos que no esten vacios

Estas en el tema de Contar en una misma tabla los campos que no esten vacios en el foro de Mysql en Foros del Web. Hola, A ver si podeis ayudarme que llevo una horita provando de todo y no se como hacerlo. Tengo una tabla con la siguiente estructura. ...
  #1 (permalink)  
Antiguo 04/04/2013, 15:56
 
Fecha de Ingreso: marzo-2008
Mensajes: 82
Antigüedad: 16 años, 1 mes
Puntos: 0
Contar en una misma tabla los campos que no esten vacios

Hola,
A ver si podeis ayudarme que llevo una horita provando de todo y no se como hacerlo.
Tengo una tabla con la siguiente estructura.

id categoria descripcion aprovado des2 des3 des4

lo que quiero hacer es contar pero no sumar todas las categorias que tengan aprovado='NO' y todas las posibilidades que des2 no este vacio ni des3 ni des4 tampoco.

ya que puede que algunas categorias tengan:
-des2, des3 y des4 vacios.
-des2 lleno y des3 y des4 vacios.
-des2 y des3 llenos y des4 vacio
-des2, des3 y des4 todos llenos


No se si me estoy explicando pero pongo un ejemplo siguiendo la estructura anterior

1 | aventuras | julio verne | NO | lleno lleno vacio
2 | literatura | otro | NO | lleno vacio vacio

aqui me deberia contar 3 dos llenos del primero y uno del segundo.

A ver si alguien me puede hechar un cable pleaseee!!!
  #2 (permalink)  
Antiguo 04/04/2013, 16:28
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Contar en una misma tabla los campos que no esten vacios

Hola riscking:

Vayamos por partes, cuando te refieres a VACIO y LLENO, ¿te refieres a esas palabras simplemente a que puedan tener o no algo?, te recuerdo que en BD el concepto de VACIO, está representado por el NULL, que no la palabra 'NULL', son cosas muy distintas. para el ejemplo voy a suponer que tus campos "VACIOS" en realidad tienen un NULL asignado, podrías hacer lo siguiente:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+------------+-------------+----------+-------+-------+-------+
  3. | id   | categoria  | descripcion | aprobado | des2  | des3  | des4  |
  4. +------+------------+-------------+----------+-------+-------+-------+
  5. |    1 | aventuras  | julio verne | NO       | lleno | lleno | NULL  |
  6. |    2 | literatura | otro        | NO       | lleno | NULL  | NULL  |
  7. |    3 | ciencia    | matematicas | SI       | lleno | NULL  | NULL  |
  8. |    4 | humor      | quino       | NO       | lleno | NULL  | lleno |
  9. +------+------------+-------------+----------+-------+-------+-------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT SUM( IF(aprobado = 'NO' AND des2 IS NOT NULL, 1, 0) +
  13.     ->             IF(aprobado = 'NO' AND des3 IS NOT NULL, 1, 0) +
  14.     ->             IF(aprobado = 'NO' AND des4 IS NOT NULL, 1, 0)) total
  15.     -> FROM tabla;
  16. +-------+
  17. | total |
  18. +-------+
  19. |     5 |
  20. +-------+
  21. 1 row in set (0.00 sec)

Observa que estoy realizando una suma condicional, un especie de

Código:
contador = contador + 1
Cada vez que se analiza un campo se verifica si el campo aprobado (Si, con B y no con V) es igual a 'NO' y si el campo tiene algún contenido (IS NOT NULL) si es así se suma 1 al contador, y en caso se le suma un cero (en otras palabaras no se le suma nada). Observa que en la tabla hay 6 campos llenos, pero uno de ellos tiene aprobado = 'SI', por lo tanto este campo no se contabiliza.

hay muchas otras formas para llegar al mismo resultado. Dale un vistazo para ver si te sirve.

Saludos
Leo.
  #3 (permalink)  
Antiguo 04/04/2013, 19:14
 
Fecha de Ingreso: marzo-2008
Mensajes: 82
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Contar en una misma tabla los campos que no esten vacios

La verdad que si esta vacio esta vacio y listo, lo de NULL como no controlo mucho pues lo deje asi no se si es mejor trabajar asi o no. Es mejor usar NULL si esta vació??? esque tampoco controlo mucho, pero seria cuestion de probar.

De todas formas acoplando tu ejemplo me funciona correctamente, nohabia usado nunca ifs en sql, jeje, me ha quedada así, como ves en vez de IS NOT NULL pongo !=''

SELECT SUM( IF( approved = 'NO'
AND des2 != '', 1, 0 ) + IF( approved = 'NO'
AND des3 != '', 1, 0 ) + IF( approved = 'NO'
AND des4 != '', 1, 0 ) ) total
FROM categorias;

Lo de des4 != '', 1, 0 el 1 y e 0 para que son????

Última edición por riscking; 04/04/2013 a las 19:28
  #4 (permalink)  
Antiguo 05/04/2013, 06:49
Avatar de zalito12  
Fecha de Ingreso: noviembre-2011
Ubicación: Coruña, España
Mensajes: 430
Antigüedad: 12 años, 5 meses
Puntos: 67
Respuesta: Contar en una misma tabla los campos que no esten vacios

¿Y algo más sencillo?

Código MySQL:
Ver original
  1. SELECT sdes2+sdes3+sdes4 FROM
  2. (SELECT des2,COUNT(des2) 'sdes2' FROM tabla WHERE des2 = '' GROUP BY des2) a1,
  3. (SELECT des3,COUNT(des3) 'sdes3' FROM tabla WHERE des3 = '' GROUP BY des3) a2,
  4. (SELECT des4,COUNT(des4) 'sdes4' FROM tabla WHERE des4 = '' GROUP BY des4) a3;

Última edición por zalito12; 05/04/2013 a las 06:56
  #5 (permalink)  
Antiguo 05/04/2013, 10:54
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Contar en una misma tabla los campos que no esten vacios

Hola de nuevo riscking:

Otra vez, vayamos por partes:

Cita:
Iniciado por riscking Ver Mensaje
La verdad que si esta vacio esta vacio y listo, lo de NULL como no controlo mucho pues lo deje asi no se si es mejor trabajar asi o no. Es mejor usar NULL si esta vació??? esque tampoco controlo mucho, pero seria cuestion de probar.

De todas formas acoplando tu ejemplo me funciona correctamente, nohabia usado nunca ifs en sql, jeje, me ha quedada así, como ves en vez de IS NOT NULL pongo !=''
Mucho cuidado, te lo comenté desde el post pasado, en BD el concepto de campo vacío es distinto al concepto de un campo con una cadena vacía, con este script creo que se entiende mejor, supongamos que tengo una tabla a la cual voy a asignar distintos valores:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla (id INT, campo VARCHAR(5));
  2. Query OK, 0 rows affected (0.10 sec)
  3.  
  4. mysql> INSERT INTO tabla VALUES
  5.     ->(1, 'algo'),
  6.     ->(2, 'NULL'),
  7.     ->(3, ''),
  8.     ->(4, NULL);
  9. Query OK, 4 rows affected (0.05 sec)
  10. Records: 4  Duplicates: 0  Warnings: 0
  11.  
  12. mysql> SELECT * FROM tabla;
  13. +------+-------+
  14. | id   | campo |
  15. +------+-------+
  16. |    1 | algo  |
  17. |    2 | NULL  |
  18. |    3 |       |
  19. |    4 | NULL  |
  20. +------+-------+
  21. 4 rows in set (0.00 sec)

Observa que inserto 'NULL' como cadena, NULL como valor y una cadena vacía (''), pero qué pasa al hacer las comparaciones:

Para comparar si un campo está vacío:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE campo IS NULL;
  2. +------+-------+
  3. | id   | campo |
  4. +------+-------+
  5. |    4 | NULL  |
  6. +------+-------+
  7. 1 row in set (0.00 sec)

Observa, para MySQL una cadena vacía ('') NO ES UN VALOR NULO:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE campo IS NOT NULL;
  2. +------+-------+
  3. | id   | campo |
  4. +------+-------+
  5. |    1 | algo  |
  6. |    2 | NULL  |
  7. |    3 |       |
  8. +------+-------+
  9. 3 rows in set (0.00 sec)

Observa qué pasa cuando preguntas por una cadena vacía:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE campo = '';
  2. +------+-------+
  3. | id   | campo |
  4. +------+-------+
  5. |    3 |       |
  6. +------+-------+
  7. 1 row in set (0.00 sec)

El registro id=4 que tiene NULL NO APARECE EN EL LISTADO, por eso te pedía que fueras claro en este sentido... Lo mismo pasa al buscar 'NULL' como cadena, no como vacío:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla WHERE campo = 'NULL';
  2. +------+-------+
  3. | id   | campo |
  4. +------+-------+
  5. |    2 | NULL  |
  6. +------+-------+
  7. 1 row in set (0.00 sec)


Cita:
Iniciado por riscking Ver Mensaje
Lo de des4 != '', 1, 0 el 1 y e 0 para que son????
Creo que no pusiste atención a al explicación que te dí en el post, pues ahí lo expreso cláramente para qué son el 0 y el 1:

Código:
Observa que estoy realizando una suma condicional, un especie de 

contador = contador + 1

Cada vez que se analiza un campo se verifica si el campo aprobado (Si, con B y no con V) es igual a 'NO' y si el campo tiene algún contenido (IS NOT NULL) si es así se suma 1 al contador, y en caso se le suma un cero (en otras palabaras no se le suma nada). Observa que en la tabla hay 6 campos llenos, pero uno de ellos tiene aprobado = 'SI', por lo tanto este campo no se contabiliza.
y también, tal como te lo comenté al inicio, hay muchas formas que tienes para obtener el mismo resultado, aunque no estoy seguro que la forma que propone zalito12 funcione y en no creo que sea más 'sencilla', pues a final de cuentas está realizando tres subconsultas y un producto cartesiano entre las tablas, pero bueno, es cuestión que pruebas la solución y nos digas si es funcional y si tiene mejor rendimiento.

Saludos
Leo.

Etiquetas: campos, tabla, vacios
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 15:17.