[ Foro de SQL (y MySQL) ]

CONSULTA COMPLEJA SQL

22-Nov-2010 11:23
German Mndez
8 Respuestas

TABLAS

HORARIOS(EO,ED,TT,HS,HL)
SIGNIFICADO: el tren de tipo TT que sale de EO a las HS, llega a ED a las HL
CLAVES:(EO,ED,HS)

PRECIOS(EO,ED,TT,TB,I)
SIGNIFICADO: el billete de tipo TB, entre las estaciones EO y ED , en el tipo de tren TT, vale I euros
CLAVES:(EO,ED,TT,TB)

VIAJEROS(DNI,EO,ED,TT,TB,F,HS)
SIGN: la persona con dni ha utilizado un billete de tipo TB entre las estaciones EO y ED en el tipo de tren TT, el dia F, con hora de salida HS.
CLAVES(DNI,EO,ED,F)

CONSULTAS A RESOLVER EN SQL

- Estaciones tales que, al menos el 40% de sus trenes van a un mismo destino.


salds y a ver si hallamos respts.. :P


24-Nov-2010 22:57
Nacho Cabanes (+32)

Y la duda es... ¿cual?

Dí hasta donde has llegado y qué no te funciona, para que te podamos ayudar a enfocar lo que falta. No esperes que hagamos todo por ti...  ;-)


25-Nov-2010 11:16
German Mndez

entrando un poco en la dinamica del ejercicio.. en el apartado c) por ejemplo hablar de obtener las personas que a lo largo del tiempo han utilizado todos los tipos de trenes.. lo que me lleva a pensar que en el algebra relacional la consulta sea un cociente.. dado que R/S = Q, en Q se presentarian las tuplas de R que contengan todo S.. la pregunta es.. en SQL como se hace ese cociente??..


luego en la primera.. lo de diariamente me desconcierta..

SELECT COUNT(TT) , F
FROM VIAJEROS
WHERE (EO=ATOCHA)
GROUP BY F
HAVING COUNT(DISTINCT F)=1;


04-Dec-2010 12:40
Nacho Cabanes (+32)

Sigues dando pocos detalles. Hablas de un "diariamente" en una primera pregunta... que no habías mencionado hasta ahora.

Por otra parte, deja de lado el álgebra relacional. Es una herramienta distinta, más abstracta, y no todo lo que se puede hacer con una notación se puede conseguir con la otra "simplemente convirtiendo la notación". Es preferible que intentes entender la forma en que se trabaja con SQL, en vez de buscar analogías con el álgebra relacional, porque no siempre las habrá, y a veces aunque las haya... no será de gran ayuda.

Además, no puedo creer que la primera consulta que te han planteado sea la de sea "Estaciones tales que, al menos el 40% de sus trenes van a un mismo destino" y la tercera (apartado c?) sea "personas que han utilizado todos los trenes"... y si es así, son demasiado poco progresivos. Si no te han dado ejercicios más simples para asegurar que asimiles los fundamentos, deberías proponértelos tú mismo, porque la forma de resolver consultas complejas debe ser incremental (trenes que van a un destino concreto, trenes que van a un mismo destino, cantidad de trenes por estación que van a un mismo destino...)

Por ejemplo, podrías proponerte cosas como:

- Trenes que van a la estación A.

- Trenes que van a la estación A en horario nocturno.

- Precio de los billetes de los trenes que van a la estación A en horario nocturno.

- Precios que ha pagado el viajero X en sus viajes de la estación A.

- Cantidad de viajes que ha hecho el viajero X a cada una de las estaciones.

- Lista de trenes que van a la estación E, ordenado alfabéticamente.

- Cantidad de trenes que van a la estación E.

- Cantidad de trenes que salen de una estación F y cantidad de trenes que salen de la estación F para llegar a la estación E.

- Porcentaje de trenes que salen de la estación F para llegar a la estación E.

- ...

Si vas resolviendo ejercicios de dificultad creciente, podrás atacar a los complicados. Si no, te faltará base y no podrás con ellos.


04-Dec-2010 14:52
German Mndez

no haber.. yo creo tener esa base.. pero el llegar a ese tipo de consultas me desconcierta.. y no llego a saber responderlas.. entonces quizas quiero basarme en otros tipos de relaciones como el algebra relacion o calculo relacional que me den esa idea.. que la dan.. pero como dices tu.. quizas los tg que dejar de lado.. mas con simplificar la consulta.. vale.. consigues hacerla.. pero llegas a la dificil y hay palabras que te desconciertan.. esas dos consultas propuestas son un ejemplo.. relacionar es comprensible.. pero cuando meten palabras bajo el entendimiento que tengas para que construyas una relacion.. es complicado por que ese concepto no lo sabes.. no se si me entiendes..


04-Dec-2010 14:55
German Mndez

ps: me faltaban cuestiones en la pregunta.. me acabo de dar cuenta

a) numero de trenes que salen diariamente desde atocha.
b) tipo de tren que hace en menos tiempo el trayecto entre atocha y Sants
c) personas que a lo largo del tiempo han utilizado todos los tipos de trenes
d) estaciones tales que, al menos el 40% de sus trenes van a un mismo destino.


05-Dec-2010 10:41
Nacho Cabanes (+32)

Te entiendo.

Y en cuanto a lo del planteamiento incremental, te pongo un ejemplo con una de tus consultas:

a) numero de trenes que salen diariamente desde atocha.

Yo lo haría en tres pasos de complejidad creciente:

- Trenes que salen desde atocha

SELECT * FROM HORARIOS WHERE EO = "Atocha"

(y compruebas que lo que sale en pantalla es razonable, a partir de los datos de prueba que has introducido)


- Número de trenes que salen desde atocha

SELECT COUNT(*) FROM HORARIOS WHERE EO = "Atocha"

(y nuevamente compruebas que es consistente con lo que tú esperabas).


- Número de trenes que salen diariamente desde atocha

Eso de "diariamente", o "en la fecha XXX", suele querer indicar que compruebes una cierta fecha (a veces en otra tabla que debes enlazar, como la tuya de "viajeros") o que agrupes los datos de tu tabla (con GROUP BY, y quizá añadiendo condiciones a los grupos usando HAVING).

En tu caso, realmente es más fácil: como la tabla es de horarios, en esa tabla tienes la información de todo lo que ocurre en un día (y sólo en un día), así que no tienes que añadir nada más, te basta con mirar sólo esa tabla tal y como ya estabas haciendo:

SELECT COUNT(*) FROM HORARIOS WHERE EO = "Atocha"


07-Dec-2010 03:19
German Mndez

pero.. en la relacion VIAJEROS el dia no es unico.. es variable en esa BBDD.. no entiendo tu referimiento en cuanto a la solucion que das.. por que diariamente para mi especifica un dia concreto entre la variedad de dias.. entenderia entonces el usar GROUP BY para su agrupacion por dias y luego con el HAVING utilizar alguna funcion para concretar cada uno y asi concretar el diariamente.. estoy intentando componer esta relacion en el OPPENOFFICE pero hay consultas que me da errores y creo que es por no poder especificar relaciones entre tablas.. no se si sabes algo de esto.. entonces comprobaria mejor la solucion que me das y a ver si termino de verla.. creo que tu solucion me daria el nº de trenes que salen de atocha, osea.. el total desde que se inicio la BBDD.. supongo que tb se podria suponer que para atocha salen siempre los mismos.. entonces faltaria el GROUP BY F.. como lo ves?


12-Dec-2010 18:08
Nacho Cabanes (+32)

La tabla de viajeros se refiere a los viajes que ha hecho cada persona. La que te dice qué ocurre cada día es la tabla de horarios: un tren haría su trayecto aunque nadie haya comprado billete. Por ejemplo, una persona podría subir en una parada intermedia: un tren va de Madrid a Alicante, aunque nadie se suba en Madrid y todos se suban en Albacete.

En cuanto a OpenOffice, no es la mejor plataforma para probar cosas de bases de datos. Yo te recomendaría alguno de los entornos basados en MySQL + PHP + PhpMyAdmin, como XAMPP, easyPHP, Uniserver, etc.

Tienes algunos detallados aquí:

http://www.nachocabanes.com/php/index.php#compiladores






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)