Ver Mensaje Individual
  #5 (permalink)  
Antiguo 05/04/2013, 10:54
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.