SQL - Ayuda con consulta de ventas por mes

 
Vista:
Imágen de perfil de Enrique
Val: 12
Ha aumentado su posición en 10 puestos en SQL (en relación al último mes)
Gráfica de SQL

Ayuda con consulta de ventas por mes

Publicado por Enrique (7 intervenciones) el 18/04/2018 00:51:25
HOLA QUE TAL CHICOS, ESTOY TRATANDO DE FORMULAR UNA CONSULTA QUE ME MUESTRE LOS COLORES Y LAS MARCAS DE COCHES MAS VENDIDOS POR MES. TODO ESTO ES EN MYSQL SERVER 5.5

HAGAN DE CUENTA QUE TENGO UNA TABLA LLAMADA COCHES CON LAS SIGUENTES COLUMNAS:

id_producto (PK) | marca | modelo | color | precio_unitario | almacen

UNA TABLA LLAMADA COMPRAS Y OTRA LLAMADA APARTADOS CON LAS COLUMNAS:

ticket_compra (PK) | id_producto (FK) | id_cliente (FK) | fecha_compra | cantidad | costo_total

ticket_apartado (PK) | id_producto (FK) | id_cliente (FK) | fecha_apartado | cantidad | costo_total

ESTA ES LA CONSULTA QUE YO FORMULE:

1
2
3
4
5
6
7
8
select c.color, c.total_compras as compras, a.total_apartados as apartados
from (select producto.color as color, sum(cantidad) as total_compras
from producto inner join compra using(id_producto)
where month(fecha_comp)=1
group by color) as c left join (select producto.color as color, sum(cantidad) as total_apartados
from producto inner join aparta using(id_producto)
where month(fecha_aprt)=1
group by color) as a on c.color=a.color;

ESTA CONSULTA ME MUESTRA LOS COLORES QUE MAS SE VENDIERON EN EL MES DE ENERO. EL DETALLE ESTA EN QUE SOLO ME MUESTRA UN COLOR PORQUE ESTE SE ENCUENTRA EN LAS DOS TABLAS. QUIERO SABER COMO LE PUEDO HACER PARA QUE MUESTRE TODOS LOS COLORES DEL MES DE ENERO YA SEA QUE ESTEN O NO EN LAS DOS TABLAS

UN EJEMPLO, TENGO COLOR ROJO EN LA TABLA COMPRA Y EN APARTA Y TENGO EL COLOR AMARILLO EN COMPRA, Y AL MOMENTO DE USAR MI SENTENCIA SOLO ME MUESTRA EL ROJO.

PODRIAN AYUDARME A IDENTIFICAR MI PROBLEMA CON MI SENTENCIA Y DECIRME QUE ESTOY HACIENDO MAL O QUE DEBERIA AGREGARLE PARA QUE QUEDE COMO QUIERO QUE QUEDE?

ASI TAMBIEN PODRIA HACERLO CON LA MARCA MAS VENDIDA POR MES O EL MODELO
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
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda con consulta de ventas por mes

Publicado por leonardo_josue (1173 intervenciones) el 18/04/2018 16:10:40
Hola Enrique:

En otro post ya te había dado la respuesta a este problema, pero tal parece que no lo leíste o simplemente lo ignoraste O_o

1
2
3
4
5
Finalmente una consideración: ¿todos los id clientes tienen compras y apartados? o puede haber clientes
sólo con compras y/o sólo con apartados? Esto es muy importante para ver qué tipo de JOIN tienes que hacer.
En el ejemplo estoy usando un LEFT JOIN considerando que todos los clientes tienen compras PERO NO
TODOS TIENEN APARTADOS. En realidad lo que deberías de hacer es un FULL JOIN para considerar
todos los casos. Si no sabes cómo funciona el FULL JOIN pregúntale a SAN GOOGLE o a SANTA WIKIPEDIA.

y para que quede más claro:

https://es.wikipedia.org/wiki/Join#Combinaci%C3%B3n_completa_(FULL_OUTER_JOIN)

MySQL no trabaja el FULL JOIN, pero en la misma página de SANTA WIKIPEDIA te dice cómo puedes simularlo haciendo una unión de LEFT y RIGTH JOIN.

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
1
Comentar
Imágen de perfil de Enrique
Val: 12
Ha aumentado su posición en 10 puestos en SQL (en relación al último mes)
Gráfica de SQL

Ayuda con consulta de ventas por mes

Publicado por Enrique (7 intervenciones) el 18/04/2018 16:23:04
SI, SI LEI TU RESPUESTA ANTERIOR Y SI ME SIRVIO, GRACIAS, SOLO QUE EN ESTA NO SEA SI SEA PROBLEMA DE QUE NO USE EL JOIN CORRECTO O AL MOMENTO DE HACER EL ON DEL 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: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda con consulta de ventas por mes

Publicado por leonardo_josue (1173 intervenciones) el 18/04/2018 19:35:36
El problema es que no aplicas el FULL JOIN... tal como te dije en el post, para considerar todos los casos DEBES DE HACER UN FULL JOIN, ya que ni el INNER ni el LEFT, ni el RIGTH funcionarían. Veamos este ejemplo si suponemos que tenemos estas dos tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tabla_a;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | rojo        |
|    2 | amarillo    |
|    3 | azul        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla_b;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | rojo        |
|    2 | verde       |
|    3 | blanco      |
+------+-------------+
3 rows in set (0.00 sec)

Entonces, si haces un INNER JOIN por color, sólo aparecerán los registros que aparezcan en AMBAS TABLAS:

1
2
3
4
5
6
7
8
mysql> SELECT * FROM tabla_a
    -> INNER JOIN tabla_b ON tabla_a.descripcion = tabla_b.descripcion;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | rojo        |    1 | rojo        |
+------+-------------+------+-------------+
1 row in set (0.00 sec)

Si utilizas un LEFT JOIN te aparecerán TODOS LOS COLORES DE LA TABLA_A unidos con aquellos registros que TAMBIEN EXISTEN EN LA TABLA_B:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla_a
    -> LEFT JOIN tabla_b ON tabla_a.descripcion = tabla_b.descripcion;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | rojo        |    1 | rojo        |
|    2 | amarillo    | NULL | NULL        |
|    3 | azul        | NULL | NULL        |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)

Este es tu caso, los colores VERDE y BLANCO que SÓLO EXISTEN EN LA TABLA B NO APARECEN. lo mismo pasa si haces un RIGTH JOIN, aparecerían TODOS LOS COLORES DE LA TABLA B pero sólo aquellos que también existan en la tabla_A:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM tabla_a
    -> RIGHT JOIN tabla_b ON tabla_a.descripcion = tabla_b.descripcion;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | rojo        |    1 | rojo        |
| NULL | NULL        |    2 | verde       |
| NULL | NULL        |    3 | blanco      |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)

En este caso no se muestran los colores AMARILLO y AZUL porque solo existen en la tabla_a... entonces ¿qué tienes que hacer? pues implementar un FULL JOIN, y ¿cómo lo haces en MySQL? pues implementas UNION's:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT * FROM tabla_a
    -> LEFT JOIN tabla_b ON tabla_a.descripcion = tabla_b.descripcion
    -> UNION
    -> SELECT * FROM tabla_a
    -> RIGHT JOIN tabla_b ON tabla_a.descripcion = tabla_b.descripcion;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | rojo        |    1 | rojo        |
|    2 | amarillo    | NULL | NULL        |
|    3 | azul        | NULL | NULL        |
| NULL | NULL        |    2 | verde       |
| NULL | NULL        |    3 | blanco      |
+------+-------------+------+-------------+
5 rows in set (0.00 sec)

Así, no importa si el color está en la tabla A o el la tabla B o en AMBAS a la vez, aparecerá en el listado.

Otra forma de mostrar todos los colores, sin hacer JOIN'S sería con UNION's simples:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT id, descripcion, 'TABLA_A' FROM tabla_A
    -> UNION ALL
    -> SELECT id, descripcion, 'TABLA_B' FROM tabla_B;
+------+-------------+---------+
| id   | descripcion | TABLA_A |
+------+-------------+---------+
|    1 | rojo        | TABLA_A |
|    2 | amarillo    | TABLA_A |
|    3 | azul        | TABLA_A |
|    1 | rojo        | TABLA_B |
|    2 | verde       | TABLA_B |
|    3 | blanco      | TABLA_B |
+------+-------------+---------+
6 rows in set (0.00 sec)

ya con esto podrías agrupar y contar lo que quieras.

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
1
Comentar