MySQL - Consulta MySql que devuelva valores Cero

 
Vista:
sin imagen de perfil
Val: 17
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Ariel David (6 intervenciones) el 19/10/2020 23:52:36
Les comento el problema. Tengo la suguiente tabla:

tabla

En donde se registran las ventas realizadas, sumarizadas por codigo de producto (campo codigo) en cada una de las sucursales.

Sobre esa tabla realizo la siguiente consulta SQL:

1
2
3
4
5
6
7
8
SELECT
codigo , sucursal, depto, proveedor,rubro, subrubro, sum(cantidad) as cantidadT,
sum(cantidad*precio) as Plata
FROM `historicos`
WHERE
`fecha` BETWEEN '2020-08-01' AND '2020-08-31'
GROUP BY codigo, sucursal
ORDER BY sucursal ASC, codigo ASC, depto ASC

Esto me trae los datos que necesito, sumando cantidades y calculando el precio del producto, agrupando por codigo y sucursal. Esto me devuelve (entre tantos otros resultados):


resultado

Pero, como podran ver, tengo codigos que hay sucursales que NO vendieron y no me aparecen en la consulta, por ejemplo el codigo 999449 se vendio en las sucursales 9, 11, 15, 21 y 23, pero yo necesito que si en alguna sucursal NO se vendo, me muestre el registro con codigo, sucursal y el resto de los valores en CERO. Les comento que la tabla HISTORICOS contiene alrededor de 30 millones de registros.

¿hay alguna forma de hacerlo? Probe con JOIN LEFT pero no llegue a ningun resultado satisfactorio.

Agradecere cualquier aporte.

Saludos !

Agregado: La tabla de sucursales es la siguiente:


sucursales

sucursales.id_sucursal == historicos.sucursal

Gracias !
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
sin imagen de perfil

Consulta MySql que devuelva valores Cero

Publicado por anonymous (59 intervenciones) el 20/10/2020 00:10:51
Pues no sé porqué no te funcionó el Left Join

En condiciones normales cuando se le indica a un quey Inner Join se le está obligando a que ambas estructuras contengan el id a relacionar, mientras que el left join lo que indica es que así esté nulo o no haya relación, de todas formas muestre el registro
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
sin imagen de perfil
Val: 17
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Ariel David (6 intervenciones) el 20/10/2020 00:13:29
Y como armarias la consulta con LEFT JOIN?
No la tengo muy clara!!
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
sin imagen de perfil

Consulta MySql que devuelva valores Cero

Publicado por anonymous (59 intervenciones) el 20/10/2020 00:16:20
A diferencia de un INNER JOIN, donde se busca una intersección respetada por ambas tablas, con LEFT JOIN damos prioridad a la tabla de la izquierda, y buscamos en la tabla derecha.

Si no existe ninguna coincidencia para alguna de las filas de la tabla de la izquierda, de igual forma todos los resultados de la primera tabla se muestran.


Ejemplo
1
2
3
4
5
6
SELECT
  E.Nombre as 'Empleado',
  D.Nombre as 'Departamento'
FROM Empleados E
LEFT JOIN Departamentos D
ON E.DepartamentoId = D.Id
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
sin imagen de perfil
Val: 17
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Ariel David (6 intervenciones) el 20/10/2020 00:32:49
Realizando esta consulta:

1
2
3
4
5
6
7
SELECT sucursales.id_sucursal, sucursales.nombre, historicos.codigo , historicos.sucursal, historicos.depto, 	historicos.proveedor,historicos.rubro, historicos.subrubro, SUM(historicos.cantidad) as cantidadT, sum(historicos.cantidad*historicos.precio) as Plata
FROM sucursales
LEFT JOIN historicos ON historicos.sucursal=sucursales.id_sucursal
WHERE historicos.fecha BETWEEN '2020-10-10' AND '2020-10-15'
AND historicos.codigo = 999566
GROUP BY historicos.codigo, historicos.sucursal
ORDER BY historicos.codigo DESC, historicos.sucursal ASC

y me devuelve esto:

Captura-realizada-el-2020-10-19-19.31.19

Como veran, en la consulta le especifique un codigo en particular, pero hay sucursales que NO vendieron ese codigo, por lo tanto deberia aparecer la sucursal, con los valores cero... que es lo que necesito.

Se que algo estoy haciendo mal, pero no me doy cuenta.

Gracias !
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
sin imagen de perfil

Consulta MySql que devuelva valores Cero

Publicado por anonymous (59 intervenciones) el 20/10/2020 02:19:13
Pues Ariel, la verdad es que me deja bastante inquieto este último query que publicas, si te está devolviendo datos así como está, hay algo raro, porque cuando se agrupa tiene que coincidir con las columnas que haya en el select.

Es decir, si yo digo select A, B necesariamente tengo que aplicar group by A, B y tú solo estás agrupando por: historicos.codigo, historicos.sucursal

Créeme que tu caso es bien raro....
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
sin imagen de perfil
Val: 17
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Ariel David (6 intervenciones) el 20/10/2020 20:49:41
Pero a historicos.codigo y a historicos.sucursal SI estan el en SELECT

1
2
3
4
5
6
7
SELECT sucursales.id_sucursal, sucursales.nombre, historicos.codigo , historicos.sucursal, historicos.depto, 	historicos.proveedor,historicos.rubro, historicos.subrubro, SUM(historicos.cantidad) as cantidadT, sum(historicos.cantidad*historicos.precio) as Plata
FROM sucursales
LEFT JOIN historicos ON historicos.sucursal=sucursales.id_sucursal
WHERE historicos.fecha BETWEEN '2020-10-10' AND '2020-10-15'
AND historicos.codigo = 999566
GROUP BY historicos.codigo, historicos.sucursal
ORDER BY historicos.codigo DESC, historicos.sucursal ASC
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
Imágen de perfil de Francisco
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Francisco (73 intervenciones) el 20/10/2020 18:46:26
Hola

Version de MySQL ??

Saludos
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
sin imagen de perfil
Val: 17
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Ariel David (6 intervenciones) el 20/10/2020 20:47:42
La version es :

Versión del servidor: 5.5.41-0ubuntu0.14.04.1 - (Ubuntu)
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
Imágen de perfil de Francisco
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Francisco (73 intervenciones) el 22/10/2020 18:31:09
Hola

Me huele que el problema es por los tipos que tienes declarados en historico.sucursal y sucursal.id_sucursal aunque los veas como INT son tipos diferentes por que estan declarados con longitudes distintas

1
2
historico.sucursal INT(2)
sucursal.id_sucursal INT(3)

Ambos deben ser iguales, es posible que me equivoque

Saludos
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
Imágen de perfil de Francisco
Val: 201
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Francisco (73 intervenciones) el 22/10/2020 19:08:34
Hola

Bueno revisando encontre los siguiente
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
select version() as 'mysql version';
 
drop table IF EXISTS sucursales;
drop table IF EXISTS historico;
 
Create table historico (
	id Int(20) NOT NULL AUTO_INCREMENT,
	sucursal Int(2),
	fecha Date,
 Primary Key (id)
);
 
Create table sucursales (
	id_sucursal Int(3) NOT NULL,
	nombre Varchar(50),
 Primary Key (id_sucursal)
);
 
INSERT INTO historico(sucursal, fecha) VALUES(1, '2020-10-22');
INSERT INTO historico(sucursal, fecha) VALUES(1, '2020-10-20');
INSERT INTO historico(sucursal, fecha) VALUES(1, '2020-10-19');
INSERT INTO historico(sucursal, fecha) VALUES(1, '2020-10-18');
INSERT INTO historico(sucursal, fecha) VALUES(1, '2020-10-17');
 
INSERT INTO historico(sucursal, fecha) VALUES(2, '2020-10-22');
INSERT INTO historico(sucursal, fecha) VALUES(2, '2020-10-20');
INSERT INTO historico(sucursal, fecha) VALUES(2, '2020-10-19');
INSERT INTO historico(sucursal, fecha) VALUES(2, '2020-10-18');
INSERT INTO historico(sucursal, fecha) VALUES(2, '2020-10-17');
 
INSERT INTO historico(sucursal, fecha) VALUES(3, '2020-10-22');
INSERT INTO historico(sucursal, fecha) VALUES(3, '2020-10-20');
INSERT INTO historico(sucursal, fecha) VALUES(3, '2020-10-19');
INSERT INTO historico(sucursal, fecha) VALUES(3, '2020-10-18');
INSERT INTO historico(sucursal, fecha) VALUES(3, '2020-10-17');
 
INSERT INTO sucursales(id_sucursal, nombre) VALUES(1, 'SUCURSAL 1');
INSERT INTO sucursales(id_sucursal, nombre) VALUES(2, 'SUCURSAL 2');
INSERT INTO sucursales(id_sucursal, nombre) VALUES(3, 'SUCURSAL 3');
INSERT INTO sucursales(id_sucursal, nombre) VALUES(4, 'SUCURSAL 4');
INSERT INTO sucursales(id_sucursal, nombre) VALUES(5, 'SUCURSAL 5');
 
 
SELECT * FROM historico;
SELECT * FROM sucursales;
 
-- Correcto
SELECT s.nombre, h.* FROM sucursales s
    LEFT JOIN historico h ON h.sucursal = s.id_sucursal;
 
-- Correcto
SELECT h.*, s.nombre FROM historico AS h
   RIGHT JOIN sucursales s ON s.id_sucursal = h.sucursal;
 
-- De esta manera no funciona
SELECT h.*, s.nombre FROM historico AS h
   LEFT JOIN sucursales s ON s.id_sucursal = h.sucursal;

Resultado

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
mysql version
1	5.7.12-log
 
  	id	sucursal	fecha
1	1	1	22.10.2020 00:00:00
2	2	1	20.10.2020 00:00:00
3	3	1	19.10.2020 00:00:00
4	4	1	18.10.2020 00:00:00
5	5	1	17.10.2020 00:00:00
6	6	2	22.10.2020 00:00:00
7	7	2	20.10.2020 00:00:00
8	8	2	19.10.2020 00:00:00
9	9	2	18.10.2020 00:00:00
10	10	2	17.10.2020 00:00:00
11	11	3	22.10.2020 00:00:00
12	12	3	20.10.2020 00:00:00
13	13	3	19.10.2020 00:00:00
14	14	3	18.10.2020 00:00:00
15	15	3	17.10.2020 00:00:00
 
  	id_sucursal	nombre
1	1	SUCURSAL 1
2	2	SUCURSAL 2
3	3	SUCURSAL 3
4	4	SUCURSAL 4
5	5	SUCURSAL 5
 
  	nombre	id	sucursal	fecha
1	SUCURSAL 1	1	1	22.10.2020 00:00:00
2	SUCURSAL 1	2	1	20.10.2020 00:00:00
3	SUCURSAL 1	3	1	19.10.2020 00:00:00
4	SUCURSAL 1	4	1	18.10.2020 00:00:00
5	SUCURSAL 1	5	1	17.10.2020 00:00:00
6	SUCURSAL 2	6	2	22.10.2020 00:00:00
7	SUCURSAL 2	7	2	20.10.2020 00:00:00
8	SUCURSAL 2	8	2	19.10.2020 00:00:00
9	SUCURSAL 2	9	2	18.10.2020 00:00:00
10	SUCURSAL 2	10	2	17.10.2020 00:00:00
11	SUCURSAL 3	11	3	22.10.2020 00:00:00
12	SUCURSAL 3	12	3	20.10.2020 00:00:00
13	SUCURSAL 3	13	3	19.10.2020 00:00:00
14	SUCURSAL 3	14	3	18.10.2020 00:00:00
15	SUCURSAL 3	15	3	17.10.2020 00:00:00
16	SUCURSAL 4	NULL	NULL	NULL
17	SUCURSAL 5	NULL	NULL	NULL
 
  	id	sucursal	fecha	nombre
1	1	1	22.10.2020 00:00:00	SUCURSAL 1
2	2	1	20.10.2020 00:00:00	SUCURSAL 1
3	3	1	19.10.2020 00:00:00	SUCURSAL 1
4	4	1	18.10.2020 00:00:00	SUCURSAL 1
5	5	1	17.10.2020 00:00:00	SUCURSAL 1
6	6	2	22.10.2020 00:00:00	SUCURSAL 2
7	7	2	20.10.2020 00:00:00	SUCURSAL 2
8	8	2	19.10.2020 00:00:00	SUCURSAL 2
9	9	2	18.10.2020 00:00:00	SUCURSAL 2
10	10	2	17.10.2020 00:00:00	SUCURSAL 2
11	11	3	22.10.2020 00:00:00	SUCURSAL 3
12	12	3	20.10.2020 00:00:00	SUCURSAL 3
13	13	3	19.10.2020 00:00:00	SUCURSAL 3
14	14	3	18.10.2020 00:00:00	SUCURSAL 3
15	15	3	17.10.2020 00:00:00	SUCURSAL 3
16	NULL	NULL	NULL	SUCURSAL 4
17	NULL	NULL	NULL	SUCURSAL 5
 
  	id	sucursal	fecha	nombre
1	1	1	22.10.2020 00:00:00	SUCURSAL 1
2	2	1	20.10.2020 00:00:00	SUCURSAL 1
3	3	1	19.10.2020 00:00:00	SUCURSAL 1
4	4	1	18.10.2020 00:00:00	SUCURSAL 1
5	5	1	17.10.2020 00:00:00	SUCURSAL 1
6	6	2	22.10.2020 00:00:00	SUCURSAL 2
7	7	2	20.10.2020 00:00:00	SUCURSAL 2
8	8	2	19.10.2020 00:00:00	SUCURSAL 2
9	9	2	18.10.2020 00:00:00	SUCURSAL 2
10	10	2	17.10.2020 00:00:00	SUCURSAL 2
11	11	3	22.10.2020 00:00:00	SUCURSAL 3
12	12	3	20.10.2020 00:00:00	SUCURSAL 3
13	13	3	19.10.2020 00:00:00	SUCURSAL 3
14	14	3	18.10.2020 00:00:00	SUCURSAL 3
15	15	3	17.10.2020 00:00:00	SUCURSAL 3

Saludos
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
sin imagen de perfil

Consulta MySql que devuelva valores Cero

Publicado por anonymous (59 intervenciones) el 22/10/2020 19:58:24
Muy buen ojo el de Francisco.

Es correcta su apreciación, columnas con diferente longitud en el tipo de dato tienen sus inconvenientes, en unos motores más que otros.

Y lo del Rigth y Left, suele ser muy común equivocarse con este tipo de combinaciones, que finalmente no son más que operaciones básicas entre conjuntos, pero la clave es mirar desde donde se esté mirando la intersección, donde estoy parado yo y desde que perspectiva quiero obtener el resultado.

Observar este enlace que me gustó por lo explicito de la situación que se está dando acá

https://programacionymas.com/blog/como-funciona-inner-left-right-full-join
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
sin imagen de perfil
Val: 17
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Consulta MySql que devuelva valores Cero

Publicado por Ariel David (6 intervenciones) el 22/10/2020 20:13:15
Excelente, voy a analizar las situaciones y les comento como me va. Gracias !
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