SQL - Left Join no me muestra nulos

   
Vista:

Left Join no me muestra nulos

Publicado por Miguel (2 intervenciones) el 03/11/2017 15:49:45
Hola muchachos, agradezco su amable ayuda para la siguiente consulta en SQL Server:

En realidad la consulta no es esta, pero básicamente es la misma estructura, resulta que tengo una tabla de clientes y una tabla de ventas, quiero obtener un listado de los clientes y un totalizado de sus ventas hayan o no hayan tenido, en caso de que no hayan tenido lo que ocupo es que se muestre null o bien cero.

El query es el siguiente:

1
2
3
4
SELECT a.codigoCliente,a.nombreCliente,ISNULL(SUM(b.monto),0)
FROM Clientes a LEFT JOIN Ventas b ON a.codigoCliente = b.codigoCliente
WHERE codigoCliente = 150
GROUP BY a.codigoCliente,a.nombreCliente

El cliente que estoy consultando no tuvo ventas pero al ejecutar el query este no retorna nada, yo esperaría ver algo así:

Codigo, NOMBRE, VENTAS
150, Juan, 0 (o NULL)

No se que tengo que cambiar o si el problema este en la sumatoria o que.

Agradezco mucho la ayuda que me puedan brindar.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Left Join no me muestra nulos

Publicado por leonardo_josue (1139 intervenciones) el 03/11/2017 21:37:03
Hola Miguel:

1
El cliente que estoy consultando no tuvo ventas pero al ejecutar el query este no retorna nada, yo esperaría ver algo así:


Si la consulta no te regresa nada, entonces es que no hay ningún registro que cumpla con la condición... trata de quitar el WHERE y verifica si el en el listado aparece el valor que te interesa, si es así, entonces el problema es el WHERE, no la suma.

Si aun quitando el WHERE sigues sin obtener la información que quieres, entonces hay algunos detalles a considerar:

1. No nos dices con qué BD's estás trabajando, pero debes cuidar que la función ISNULL sirva para reemplazar un valor NULO por un valor por defecto... MySql por ejemplo, tienes dos funciones muy parecidas ISNULL e IFNULL, pero con dos funcionalidades completamente distintas:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT ISNULL(NULL), IFNULL(NULL, 0)
    -> UNION
    -> SELECT ISNULL('a'), IFNULL('a', 0);
+--------------+-----------------+
| ISNULL(NULL) | IFNULL(NULL, 0) |
+--------------+-----------------+
|            1 | 0               |
|            0 | a               |
+--------------+-----------------+
2 rows in set (0.00 sec)

En otras palabras, ISNULL regresa un TRUE (1) o un FALSE (0) si el parámetro que se envía es un NULL... IFNULL regresa el valor por defecto si el parámetro es NULL o el mismo valor si es diferente de NULL, en otras palabras, IFNULL sería el equivalente a esto:

1
CASE WHEN parametro IS NULL THEN 0 ELSE parámetro END

2. en el WHERE NO ESTÁS PONIENDO SOBRE QUÉ TABLA QUIERES HACER LA COMPARACIÓN, por lo tanto, si el campo existe en más de una tabla, debería de marcar un error de columna ambigua. tal como lo haces en el ON, debes también de anteponer el alias que estás poniéndole a tu tabla:

1
2
3
4
...
WHERE
  a.codigoCliente = 150
...

Aquí un ejemplo de como sería en MySQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mysql> SELECT * FROM clientes;
+------------+----------------+
| id_cliente | nombre_cliente |
+------------+----------------+
|          1 | cliente uno    |
|          2 | cliente dos    |
|          3 | cliente tres   |
+------------+----------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM ventas;
+----------+------------+-------------+
| id_venta | id_cliente | monto_venta |
+----------+------------+-------------+
|        1 |          1 |          10 |
|        2 |          1 |          20 |
|        3 |          1 |          30 |
|        4 |          1 |          40 |
|        5 |          2 |           5 |
|        6 |          2 |          15 |
+----------+------------+-------------+
6 rows in set (0.00 sec)
 
mysql> SELECT
    ->   a.id_cliente,
    ->   a.nombre_cliente,
    ->   IFNULL(SUM(b.monto_venta), 0) total_ventas
    -> FROM Clientes a
    -> LEFT JOIN Ventas b ON a.id_cliente = b.id_cliente
    -> GROUP BY a.id_cliente, a.nombre_cliente;
+------------+----------------+--------------+
| id_cliente | nombre_cliente | total_ventas |
+------------+----------------+--------------+
|          1 | cliente uno    |          100 |
|          2 | cliente dos    |           20 |
|          3 | cliente tres   |            0 |
+------------+----------------+--------------+
3 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Left Join no me muestra nulos

Publicado por Miguel (2 intervenciones) el 06/11/2017 18:02:18
Gracias leonardo, probé quitando el where y así si me mostró todos los datos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad