SQL - Problema con tarea de consultas sql

   
Vista:

Problema con tarea de consultas sql

Publicado por jeffon (2 intervenciones) el 31/03/2016 18:29:02
Hola, estoy estudiando DAM en elearning y estoy realizando una tarea de consultas sql, me quedan dos por hacer y no se como sacarlas, usamos Oracle 11g, son las siguientes:
-Obtener los clientes cuya línea de crédito sea mayor que los pagos que haya realizado.
-¿Cuál es el pedido más caro del empleado que más clientes tiene.
Las tablas de donde hay que sacarlas son las siguientes:
--------------------
Clientes
--------------------
codigocliente
nombrecliente
nombrecontacto
apellidocontacto
telefono
fax
lineadireccion1
lineadireccion2
ciudad
region
pais
codigopostal
codigoempleadorepventas
limitecredito
--------------------

--------------------
Pagos
--------------------
codigocliente
formapago
idtransaccion
fechapago
cantidad
--------------------

--------------------
Empleados
--------------------
codigoempleado
nombre
apellido1
apellido2
extension
email
codigooficina
codigojefe
puesto
--------------------

--------------------
pedidos
--------------------
codigopedido
fechapedido
fechaesperada
fechaentrega
estado
comentarios
codigocliente
--------------------

--------------------
detallepedidos
--------------------
codigopedido
codigoproducto
cantidad
preciounidad
numerolinea
--------------------
He probado durante horas y no consigo dar con las consultas adecuadas, en la primera he intentado hacer la comparacion entre la suma de los pagos realizados por cada cliente agrupandolos por el codigo de cliente con su limite de credito correspondiente, pero no soy capaz de encontrar la forma de hacerlo, la otra no se muy bien por donde cogerla, he hecho 36 consultas de 38 que trae la tarea, por lo que me interesa mas entender como se hace que el hecho de hacerlo en si, cualquier pista que me deis os la agradecere.
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

Problema con tarea de consultas sql

Publicado por leonardo_josue (880 intervenciones) el 31/03/2016 19:28:50
Hola jeffon:

En realidad tienes muchas formas de resolver las consultas que estás planteando, algunas más sencillas, algunas más complejas pero en realidad no son tan complicadas como parecen.

Vayamos con la primera: Obtener los clientes cuya línea de crédito sea mayor que los pagos que haya realizado.

Aquí el problema de entrada es que la información de la línea de crédito y los pagos realizados están en dos tablas, pero tienes una relación 1 a muchos, es decir, un cliente (con una linea de crédito) puede tener n pagos, por lo tanto no puedes hacer un JOIN simple, sino que primero tienes que "consolidar" los pagos para cambiar la relación 1 a 1. ¿qué es esto? bueno, vayamos al 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 clientes;
+------------+--------+---------------+
| id_cliente | nombre | limitecredito |
+------------+--------+---------------+
|          1 | uno    |           100 |
|          2 | dos    |           200 |
|          3 | tres   |           300 |
|          4 | cuatro |           400 |
+------------+--------+---------------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM pagos;
+---------+------------+----------+
| id_pago | id_cliente | cantidad |
+---------+------------+----------+
|       1 |          1 |      100 |
|       2 |          2 |      200 |
|       3 |          2 |      200 |
|       4 |          3 |      100 |
|       5 |          3 |      100 |
+---------+------------+----------+
5 rows in set (0.00 sec)

Lo primero que tienes que hacer es calcular el total de pagos que ha realizado cada cliente, lo cual consigues simplemente con una función SUM y una agrupación:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT id_cliente, SUM(cantidad) totalpagos
    -> FROM pagos
    -> GROUP BY id_cliente;
+------------+------------+
| id_cliente | totalpagos |
+------------+------------+
|          1 |        100 |
|          2 |        400 |
|          3 |        200 |
+------------+------------+
3 rows in set (0.00 sec)

Observa que los registros están "consolidados" o agrupados, por lo tanto puedes hacer ahora si una relación 1 a 1 con tu tabla de clientes... esto lo logras metiendo esta consulta como una SUBCONSULTA para hacer el JOIN, así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT C.id_cliente, C.nombre, C.limitecredito, T.totalpagos
    -> FROM clientes C
    -> LEFT JOIN
    -> ( SELECT id_cliente, SUM(cantidad) totalpagos
    ->   FROM pagos
    ->   GROUP BY id_cliente) T ON c.id_cliente = T.id_cliente;
+------------+--------+---------------+------------+
| id_cliente | nombre | limitecredito | totalpagos |
+------------+--------+---------------+------------+
|          1 | uno    |           100 |        100 |
|          2 | dos    |           200 |        400 |
|          3 | tres   |           300 |        200 |
|          4 | cuatro |           400 |       NULL |
+------------+--------+---------------+------------+
4 rows in set (0.00 sec)

Observa por un lado que realizo un LEFT JOIN debido a que puede haber clientes que NO HAYAN REALIZADO NINGÚN PAGO (como el caso del cliente cuatro). Con esta consulta obtengo los dos datos que necesito, que son el límite de crédito de cada cliente y el total de pagos que ha realizado. El resto sería simplemente agregar una condición WHERE para filtrar aquellos que cumplan con la condición original, (sólo debes tener cuidado con el NULL, ya que este no es lo mismo que 0, ojo con eso).

En cuanto a la segunda consulta, la lógica en realidad sería algo similar, es decir, hacer la consulta por partes,

1. En primer lugar enfócate en encontrar al empleado que tiene más clientes, ¿cómo lo harías? igual tienes varias formas, con MAX-COUNT, con RANK-PARTITION, con ORDER BY, ETC.

2. Una vez que tengas este dato, lo utilizas como insumo para otra subconsulta, y debes volver a utilizar las funciones de agrupación... para obtener el más algo pedido.

Suena más complicada de lo que realmente es, sigue intentando y estoy seguro de que lo conseguirás.

Si continuas con problemas, postea lo que lleves de avance y con gusto te ayudamos a completar/corregir lo que falte.

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

Problema con tarea de consultas sql

Publicado por jeffon (2 intervenciones) el 01/04/2016 11:35:00
Muchas gracias por la respuesta, la primera me ha funcionado haciendolo como me has explicado, voy a ver hasta donde llego con la segunda, pero lo dicho muchas gracias por la respuesta.
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