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

[SOLUCIONADO] Problema con IS NULL SQL

Estas en el tema de Problema con IS NULL SQL en el foro de Mysql en Foros del Web. Buenas a todos, lo primero feliz año a todos. Lo segundo es que tengo una duda que no consigo resolver y a ver si me ...
  #1 (permalink)  
Antiguo 02/01/2016, 06:18
 
Fecha de Ingreso: agosto-2015
Mensajes: 40
Antigüedad: 9 años, 3 meses
Puntos: 0
Problema con IS NULL SQL

Buenas a todos,
lo primero feliz año a todos.
Lo segundo es que tengo una duda que no consigo resolver y a ver si me ayudáis.
Quiero conseguir una tabla así:

Equipo Total goles
El resto 100
Barcelona 99
Madrid 99
Atletico 80
Villareal 87
Valencia 90


Hago el siguiente query:

Código MySQL:
Ver original
  1.  CASE
  2.     WHEN equipo IS NULL THEN 'El resto'
  3.     ELSE equipo End equipo
  4.     ,   count(goles) AS Total goles
  5.  FROM futbol
  6.  GROUP BY equipo
pero la tabla me sale así
Equipo Total goles
100
Barcelona 99
Madrid 99
Atletico 80
Villareal 87
Valencia 90


Como podéis ver no me pone "El resto" y me deja el campo en blanco ya que en base de datos el campo equipo es NULL.
Por favor necesito ayuda.
Muchas gracias a todos los que me ayuden.
Saludos.

Última edición por gnzsoloyo; 02/01/2016 a las 08:58
  #2 (permalink)  
Antiguo 02/01/2016, 09:05
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con IS NULL SQL

No puedes agrupar por un campo que sea NULL, los NULL no son un dato, son un estado, por consiguiente no puede agruparse como valor ya qu ela no ser un dato tampoco es un valor.

Por lo pronto, si el campo "equipo" es un identificador importante, no es corregto que sea nulable, y menos aun que lo dejes en tal estado. Eso se consideraría un error de diseño gravísimo.
Si necesitas agrupar los valores que no se adjudican a otros equipos en un único conjunto, entonces en lugar de dejarlo NULL, pon el valor "otros" en el campo. Es más sencillo y menos problemático a la hora de las consultas.
En el contexto actual, lo más simple sería:

Código SQL:
Ver original
  1. SELECT equipos,  COUNT(goles)  TotalGoles
  2. FROM
  3.     (SELECT IFNULL(equipo, 'El resto') equipos,  goles
  4.      FROM futbol) equipos_goles
  5. GROUP BY equipos;
__________________
¿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 02/01/2016, 10:03
 
Fecha de Ingreso: agosto-2015
Mensajes: 40
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con IS NULL SQL

Lo primero gracias por la ayuda compañero.
Lo segundo
NO ES UN IDENTIFICADOR el campo equipos. Tengo otro campo llamado ID.
Me sale igual y lo he puesto como me has dicho.

Código SQL:
Ver original
  1. SELECT equipo,  COUNT(goles)  TotalGoles
  2. FROM
  3.     (SELECT IFNULL(equipo, 'El resto') equipo,  goles
  4.      FROM futbol) equipo
  5. GROUP BY equipo;

Alguna otra manera, es que me sigue saliendo vacío el campo, como antes.
Muchas gracias compañero y saludos.

Última edición por gnzsoloyo; 02/01/2016 a las 12:15
  #4 (permalink)  
Antiguo 02/01/2016, 12:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con IS NULL SQL

Por "identificador", no me estoy refiriendo a una PK, sino al hecho de que se trata de un atributo importante para identificar la entidad representada. Es viable que se use como clave alternativa, pese a no ser PK.
Por otro lado, una PK no tiene que ser necesariamente un ID numérico autoincremental, ¿lo sabías? Debería ser un atributo propio de la entidad representada que lo identifique unívocamente. El uso de ID numéricos autoincrementales es un vicio de programadores que desconocen el modelo relacional. Solo se justifica cuando en la Tercera Forma Normal no se ha llegado a un determinante.

En cuanto a tu problema, la cosa parece ser que en realidad esa columna no contiene registros en NULL, sino con caracteres vacíos, que no es lo mismo.

Hagamos una comprobación simple:

Código MySQL:
Ver original
  1. SELECT equipos,  COUNT(goles)  TotalGoles
  2.     (SELECT IF(TRIM(equipo) ='', 'Vacios', IFULL(equipo, 'Nulos')) equipos,  goles
  3.      FROM futbol) equipos_goles
  4. GROUP BY equipos;

Postea le resultado de eso y veamos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/01/2016, 14:51
 
Fecha de Ingreso: agosto-2015
Mensajes: 40
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con IS NULL SQL

Buenas de nuevo.
Muchas gracias por ayudarme compañero y tienes razon, el campo no es NULL es vacío
El código que me has dado me ha dado error. He aplicado el siguiente código:

Código SQL:
Ver original
  1. SELECT equipos AS Equipos, COUNT(goles)  AS TotalGoles
  2. FROM futbol
  3. GROUP BY equipos;

No se como se adjuntan imagenes te digo la tabla que me sale(me sale vacio la primera linea no NULL, tienes razón):
Equipos TotalGoles
110
Barcelona 99
Madrid 98
Valencia 88
Atletico 92
etc etc


Si es vacio tendria que insertar el siguiente código de mysql pero no me funciona, me da error el siguiente query, error de sintaxis:
Código SQL:
Ver original
  1. SELECT equipos,  COUNT(goles)  AS TotalGoles
  2. FROM
  3.     (SELECT IF TRIM(equipos ='', 'Vacios') equipos,  goles
  4.      FROM futbol) equipos
  5. GROUP BY equipos;

También me gustaría ordenarlos de mayor a menor de total goles.
Muchas gracias por la ayuda. Eres el único que ayuda.
Un gran saludo compañero.

Última edición por gnzsoloyo; 02/01/2016 a las 15:16
  #6 (permalink)  
Antiguo 02/01/2016, 15:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con IS NULL SQL

EL código que yo te pasé está correctamente escrito:
Código MySQL:
Ver original
  1. SELECT equipos,  COUNT(goles)  TotalGoles
  2.     (SELECT IF(TRIM(equipo) ='', 'Vacios', IFULL(equipo, 'Nulos')) equipos,  goles
  3.      FROM futbol) equipos_goles
  4. GROUP BY equipos;
ya lo verifiqué con MySQL Workbench, y no contiene errores de sintaxis.

El que tu usaste, le falta un paréntesis al menos. Ten en cuenta que IF() en ese caso es una función y no un condicional.

Código MySQL:
Ver original
  1. SELECT equipos,  COUNT(goles)  TotalGoles
  2.     (SELECT IF(TRIM(equipo) ='', 'El resto', equipo) equipos,  goles
  3.      FROM futbol) equipos_goles
  4. GROUP BY equipos;

Para mostrarte que la query no tiene errores, vamos a crear una tabla parecida a la que tienes (no tengo todos los detalles), y veamos como se comporta:
Código MySQL:
Ver original
  1. mysql> CREATE TABLE IF NOT EXISTS futbol (
  2.     ->     id_futbol INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  3.     ->     equipo VARCHAR(100) DEFAULT NULL,
  4.     ->     goles TINYINT UNSIGNED NOT NULL
  5.     -> );
  6. Query OK, 0 rows affected (0.08 sec)

Insertamos datos imaginarios:
Código MySQL:
Ver original
  1. mysql> INSERT INTO futbol(equipo, goles)
  2.     -> VALUES ('', 1),('', 1),('', 1),('', 1),('', 1),('', 1),('', 1),
  3.     -> ('Madrid', 1),('Madrid', 1),('Madrid', 1),('Madrid', 1),('Madrid', 1),
  4.     -> ('Madrid', 1),('Madrid', 1),('Madrid', 1),
  5.     -> ('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),
  6.     -> ('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),('Barcelona', 1),
  7.     -> ('Valencia', 1),('Valencia', 1),('Valencia', 1),('Valencia', 1),('Valencia', 1),('Valencia', 1),('Valencia', 1),('Valencia', 1),
  8.     -> ('Atletico', 1),('Atletico', 1),('Atletico', 1),('Atletico', 1),('Atletico', 1),('Atletico', 1),('Atletico', 1),('Atletico', 1),('Atletico', 1),
  9.     -> ('', 1),('', 1),('', 1),('', 1),('', 1),('', 1),('', 1),('', 1),('', 1);
  10. Query OK, 53 rows affected (0.03 sec)
  11. Records: 53  Duplicates: 0  Warnings: 0

Y ejecutamos la ,query, con un ORDER BY para que sea más prolijo:

Código MySQL:
Ver original
  1. mysql> SELECT equipos,  COUNT(goles)  TotalGoles
  2.     -> FROM
  3.     ->     (SELECT IF(TRIM(equipo) ='', 'Los otros', equipo) equipos,  goles
  4.     ->      FROM futbol) equipos_goles
  5.     -> GROUP BY equipos
  6.     -> ORDER BY TotalGoles DESC;
  7. +-----------+------------+
  8. | equipos   | TotalGoles |
  9. +-----------+------------+
  10. | Los otros |         16 |
  11. | Barcelona |         12 |
  12. | Atletico  |          9 |
  13. | Valencia  |          8 |
  14. | Madrid    |          8 |
  15. +-----------+------------+
  16. 5 rows in set (0.00 sec)

Obviamente, la query está bien...

Ahora, vamos a profundizar la revision. Insertamos unos equipos en NULL, y veamos como se comporta la primera consulta:
Código MySQL:
Ver original
  1. mysql> INSERT INTO futbol(equipo, goles)VALUES (NULL, 1), (NULL, 1), (NULL, 1), (NULL, 1), (NULL, 1), (NULL, 1);
  2. Query OK, 6 rows affected (0.09 sec)
  3. Records: 6  Duplicates: 0  Warnings: 0
Consultamos:
Código MySQL:
Ver original
  1. mysql> SELECT equipos,  COUNT(goles)  TotalGoles
  2.     -> FROM
  3.     ->     (SELECT IF(TRIM(equipo) ='', 'Vacios', IFNULL(equipo, 'Nulos')) equipos,  goles
  4.     ->      FROM futbol) equipos_goles
  5.     -> GROUP BY equipos
  6.     -> ORDER BY TotalGoles DESC ;
  7. +-----------+------------+
  8. | equipos   | TotalGoles |
  9. +-----------+------------+
  10. | Vacios    |         16 |
  11. | Barcelona |         12 |
  12. | Atletico  |          9 |
  13. | Valencia  |          8 |
  14. | Madrid    |          8 |
  15. | Nulos     |          6 |
  16. +-----------+------------+
  17. 6 rows in set (0.00 sec)

Todo Ok...

NOTA BENE: Efectivamente, había un error en el segundo ejemplo de la query (no en el primero), porque en medio del tipeo se me borró la "N" de IFNULL... algo que con un poco de atención te podrías haber dado cuenta al ver el primero ejemplo pasado.

Consejo: Usa MSQL Workbench para codificar en MySQL. Tiene un corrector ortográfico y sintáctico automático que te evita problemas menores como este.

https://dev.mysql.com/downloads/workbench/5.2.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/01/2016 a las 16:53
  #7 (permalink)  
Antiguo 03/01/2016, 10:35
 
Fecha de Ingreso: agosto-2015
Mensajes: 40
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con IS NULL SQL

Vale, con todo lo que me has puesto lo he solucionado.
Muchas gracias compañero.
Saludos, a cuidarse.

Etiquetas: campo, null, select, sql, tabla
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 00:57.