SQL - Consulta de suma de cantidades no sale como debe

 
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

Consulta de suma de cantidades no sale como debe

Publicado por Enrique (7 intervenciones) el 15/04/2018 07:15:39
HOLA QUE TAL, NECESITO SU AYUDA PARA RESOLVER UNA CONSULTA

TENGO UNA TABLA LLAMADA CLIENTE, OTRA COMPRA Y OTRA APARTA. COMPRA Y APARTA COMPARTEN EL ID_CLIENTE DE LA TABLA CLIENTE Y LAS DOS TIENEN UNA COLUMNA LLAMADA CANTIDAD.

ESTOY TRATANDO DE GENERAR UNA CONSULTA QUE TENGA EL ID_CLIENTE, LA CANTIDAD DE COMPRAS TOTALES HECHAS POR EL CLIENTE Y LA CANTIDAD DE APARTADOS TOTALES HECHOS POR EL CLIENTE PERO NO ME SALEN COMO DEBERIA SALIR

ESTA ES LA SENTENCIA QUE JUNTA LOS CAMPOS DE ID_CLIENTE Y CANTIDAD DE LA TABLA COMPRA:

select id_cliente, sum(compra.cantidad) as compras from compra group by id_cliente;

id_cliente compras
1 6
2 4
3 4
4 4
5 3
6 1

ESTA ES LA SENTENCIA QUE JUNTA LOS CAMPOS DE ID_CLIENTE Y CANTIDAD DE LA TABLA APARTA:

select id_cliente, sum(aparta.cantidad) as apartados from aparta group by id_cliente;

id_cliente apartados
1 9
2 3
3 2
4 3
5 4
6 2

QUIERO JUNTAR LA COLUMNA ID_CLIENTE Y UNA COLUMNA CON LA SUMA DE SUS RESPECTIVAS COMPRAS Y APARTADOS PERO LAS SUMAS NO ME DAN

ESTA ES LA SENTENCIA QUE YO REALICE, PODRIAN DECIRME COMO DEBERIA SER EN REALIDAD SI ES QUE ESTA MAL O SI LAGO LE FALTA?

select id_cliente, sum(compra.cantidad+aparta.cantidad) as total from compra inner join aparta using(id_cliente) group by id_cliente;
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
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de suma de cantidades no sale como debe

Publicado por Isaias (1921 intervenciones) el 16/04/2018 16:06:40
En que motor de base de datos estas trabajando?
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 Enrique
Val: 12
Ha aumentado su posición en 10 puestos en SQL (en relación al último mes)
Gráfica de SQL

Consulta de suma de cantidades no sale como debe

Publicado por Enrique (7 intervenciones) el 16/04/2018 16:55:27
ESTOY USANDO MYSQL SERVER 5.5
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 Leonardo Daniel A.
Val: 62
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de suma de cantidades no sale como debe

Publicado por Leonardo Daniel A. (23 intervenciones) el 16/04/2018 16:31:39
Hola, pero aun asi, se me hace que esta mal.. porque, si hay un caso en el que un cliente no tenga apartado, al hacer el join asi, te lo va a eliminar....


1
2
3
SELECT compras.id_cliente, SUM(compras.cantidad) AS compras, SUM(aparta.cantidad) AS apartados
    FROM compras LEFT OUTER JOIN aparta ON aparta.id_cliente = compras.id_cliente
    GROUP BY compras.id_cliente
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 Enrique
Val: 12
Ha aumentado su posición en 10 puestos en SQL (en relación al último mes)
Gráfica de SQL

Consulta de suma de cantidades no sale como debe

Publicado por Enrique (7 intervenciones) el 16/04/2018 16:57:00
ESA DUDA TAMBIEN ME SURGIO, SI EL CLIENTE NO TIENE UNA COMPRA O APARTADO PERO SOLO UNO DE LOS DOS, ENTONCES QUE SOLO ME DEJE EL DATO DE LA COLUMNA EN EL QUE ESTA EL ID_CLIENTE SEÑALADO
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

Consulta de suma de cantidades no sale como debe

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

Este es un problema bastante típico cuando tratas de unir tablas con relaciones 1 a muchos que se convierten en muchos a muchos... y es que al hacer el JOIN se convierte en una relación muchos a muchos y se realiza un producto cartesiano. Veamos un ejemplo, supongamos que tenemos estas tablas;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT * FROM compras;
+------+-------+
| id   | monto |
+------+-------+
|    1 |    10 |
|    1 |    20 |
|    2 |    15 |
|    2 |    16 |
|    3 |    13 |
+------+-------+
5 rows in set (0.02 sec)
 
mysql> SELECT * FROM apartados;
+------+-------+
| id   | monto |
+------+-------+
|    1 | 5     |
|    2 | 6     |
|    2 | 7     |
|    2 | 8     |
+------+-------+
4 rows in set (0.00 sec)

Observa que un id puede tener varias compras y varios apartados a la vez... entonces, si haces un JOIN entre estas tablas lo que tienes es una relación muchos a muchos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT *
    -> FROM compras
    -> LEFT JOIN apartados ON compras.id = apartados.id;
+------+-------+------+-------+
| id   | monto | id   | monto |
+------+-------+------+-------+
|    1 |    10 |    1 | 5     |
|    1 |    20 |    1 | 5     |
|    2 |    15 |    2 | 6     |
|    2 |    16 |    2 | 6     |
|    2 |    15 |    2 | 7     |
|    2 |    16 |    2 | 7     |
|    2 |    15 |    2 | 8     |
|    2 |    16 |    2 | 8     |
|    3 |    13 | NULL | NULL  |
+------+-------+------+-------+
9 rows in set (0.00 sec)

entonces, tal pareciera que el id = 2 tiene 6 compras, pero esto no es verdad, sino que al tener 2 compras y 3 apartados lo que se hace es el producto cartesiano. entonces, ¿qué se tiene que hacer? convertir la relación muchos a muchos en una relación 1 a uno...

Primero "consolidas" las compras y los apartados por separado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT id, SUM(monto) total_compras
    -> FROM compras
    -> GROUP BY id;
+------+---------------+
| id   | total_compras |
+------+---------------+
|    1 |            30 |
|    2 |            31 |
|    3 |            13 |
+------+---------------+
3 rows in set (0.00 sec)
 
mysql> SELECT id, SUM(monto) total_apartados
    -> FROM apartados
    -> GROUP BY id;
+------+-----------------+
| id   | total_apartados |
+------+-----------------+
|    1 |               5 |
|    2 |              21 |
+------+-----------------+
2 rows in set (0.00 sec)

observa que aquí los ID ya no se repite, por lo tanto puedes hacer una relación 1 a un como subconsultas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT C.id, C.total_compras, A.total_apartados
    -> FROM
    -> ( SELECT id, SUM(monto) total_compras
    ->   FROM compras
    ->   GROUP BY id ) C
    -> LEFT JOIN
    -> ( SELECT id, SUM(monto) total_apartados
    ->   FROM apartados
    ->   GROUP BY id ) A ON C.id = A.id;
+------+---------------+-----------------+
| id   | total_compras | total_apartados |
+------+---------------+-----------------+
|    1 |            30 |               5 |
|    2 |            31 |              21 |
|    3 |            13 |            NULL |
+------+---------------+-----------------+
3 rows in set (0.00 sec)

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.

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

Consulta de suma de cantidades no sale como debe

Publicado por Enrique (7 intervenciones) el 16/04/2018 16:59:40
SI EXACTO, PUEDE HABER EL CASO EN EL QUE UNO DE LOS CLIENTES TENGA COMPRAS O APARTADOS, ENTONCES ME SURGIO LA DUDA DE COMO PONER EL TOTAL DE APARTADOS.

Y POR EJEMPLO PARA SUMAR LOS TOTALES DE LAS COMPRAS Y LOS APARTADOS?
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