PDA

Ver la versión completa : Problema Sql



The_chacal
06-03-2012, 21:46
¡Hola!

Madre mía cuanto tiempo sin postear por aquí. Me alegro de que sigáis en el pié del cañón :).

Venía para haceros una consulta... el caso es que llevo toda la tarde intentando hacer una consulta SQL, que igual es una tontería pero me tiene obcecado... y esperaba que me pudierais ayudar ^_^.

Os explico:
Hay 3 tablas relacionadas como se ve en esta imagen:
Relaciones (http://imageshack.us/photo/my-images/685/relaciones.png/)
Como podéis apreciar hay una tabla cabecera de facturas, una tabla de lineas de facturas y una tabla de proveedores.

Donde; INVOICE_NUM -> NUMERO DE FACTURA
INVOICE_DATE -> FECHA DE FACTURA
AMOUNT -> IMPORTE DE LÍNEA DE FACTURA
SEMENT1 -> CIF DEL PROVEEDOR

La consulta que tengo que realizar es la siguiente;
Hay que obtener las facturas realizadas a lo largo del 2011 con un importe de la factura (osea la suma de las lineas de la factura) mayores que 300 €.



Y nada, que no lo consigo, así que cualquier aporte será de agradecer.

Gracias por anticipado.
Me alegro de haber vuelto por aquí después de tanto tiempo :).

¡Saludos!

hystd
06-03-2012, 22:59
Aunque no se especifican los tipos de datos (he considerado todos los campos numéricos), ni tampoco se especifica el motor de base de datos (mysql, oracle, etc... yo apostaría a que se trata de Access por lo "cutre" y poco atractivos que son los modelos ER :D), en SQL estándar sería algo así:



SELECT CF.INVOICE_ID
FROM CABECERAFACTURAS AS CF
WHERE CF.INVOICE_DATE=2011 AND
EXISTS
(SELECT SUM(LINFAC.AMOUNT)
FROM LINEASFACTURAS LINFAC
WHERE CF.INVOICE_ID=LINFAC.INVOICE_ID
HAVING (SUM(LINFAC.AMOUNT)>300));


Hay muchas más opciones... por ejemplo usando IN en lugar de EXISTS y suprimiendo el WHERE CF.INVOICE_ID=LINEAFAC.INVOICE_ID, o también asignando a la subconsulta un alias y en el WHERE de la primera consulta establecer la condición de que sea mayor que 300 y así lograrías suprimir el "having", y un largo etc...

Deberás adaptar esta consulta a los tipos de datos que tengas, ya que por ejemplo, probablemente para el campo "INVOICE_DATE" tendrás el tipo fecha, si es así, pues como ya he dicho, depende del tipo del motor de base de datos, ya que las funciones de mysql para trabajar con fechas son distintas a las que puede utilizar por ejemplo Oracle o Access o cualquier otro...

Esa consulta te devuelve el ID de cada factura que cumpla con las condiciones que pides.

Un saludo y re-bienvenido ;).

The_chacal
06-03-2012, 23:59
Muchas gracias por tu respuesta, que además de buena ha sido rápida.

La solución es eficiente y muestra los números de factura para esa consulta.
Pero ahora me viene el segundo problema y es que al añadir los campos del CIF y del importe me muestra muchos resultados. He estado probando con el group by y ni para atrás... ¡Que oxidado estoy!

Por cierto es SQL estándar... pero esta orientado hacia oracle.

Gracias de nuevo :), a ver si conseguimos terminar de sacarlo.

hystd
07-03-2012, 00:59
mmm, pero en el enunciado de la consulta no se habla nada del CIF:


Hay que obtener las facturas realizadas a lo largo del 2011 con un importe de la factura (osea la suma de las lineas de la factura) mayores que 300 €.


Ahí lo que se pide son "las facturas", si quieres además más información dime entonces el nuevo enunciado de la consulta cómo sería.

Un saludo.

The_chacal
07-03-2012, 06:26
Te lo pongo ta cual está;

Realiza una consulta que obtenga aquellas facturas realizadas a lo largodel año 2011 con un importe de la factura(suma de sus líneas) mayor que 300 €.
Los campos que debe devolver la consulta son los siguientes:

Cif del proveedor Número de factura Importe de la factura

Gracias de nuevo :).

hystd
08-03-2012, 04:13
uyuy, ese "Realiza" suena a "ejercicio de clase". ¿Qué quieres que te hagamos los deberes? :D. Bueno, te dejo que lo pienses, no es difícil, piensa que uno de los campos que tienes que devolver en el resultado ya lo tienes (el ID de la factura), y sólo te quedan los otros 2.

Venga ánimo, si te ves apurado entonces pregunta, pero intenta resolverlo tú, que la parte "difícil" ya la tienes.

Con respecto a resultados con campos repetidos, investiga sobre el "DISTINCT".

Un saludo.

The_chacal
12-03-2012, 10:33
Hola de nuevo;

La solución era enlazar las tablas mediante las PK, haciendo además 2 inner join. El primero con 2 tablas que nos crearía otra virtual, y luego con esa creada y la otra haríamos lo mismo.

Si alguien está interesado publico la solución (no la tengo aquí, asi que tendría que mirarlo).

Por cierto LUK, era para una formación de cara una empresa (formaba parte de un proceso de selección).

Gracias de nuevo por la ayuda.

hckr
13-03-2012, 19:12
Hola de nuevo;

La solución era enlazar las tablas mediante las PK, haciendo además 2 inner join. El primero con 2 tablas que nos crearía otra virtual, y luego con esa creada y la otra haríamos lo mismo.

Si alguien está interesado publico la solución (no la tengo aquí, asi que tendría que mirarlo).

Por cierto LUK, era para una formación de cara una empresa (formaba parte de un proceso de selección).

Gracias de nuevo por la ayuda.

A LUK lo dejas tranquilo que no ha intervenido :D:D:D

The_chacal
14-03-2012, 01:53
o.O

Madre mía... yo vi una respuesta de Luk... pero es evidente que no. Mi mente... me juega malas pasadas xD. Iba para hystd

Saludos.

hckr
14-03-2012, 17:54
o.O

Madre mía... yo vi una respuesta de Luk... pero es evidente que no. Mi mente... me juega malas pasadas xD. Iba para hystd

Saludos.

Te comprendo, todos hemos tenido alguna vez confusión de niks xD