Autor Tema: Problema de SQL.

0 Usuarios y 1 Visitante están viendo este tema.

08 Marzo, 2022, 10:06 am
Leído 373 veces

w a y s

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 255
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • I
Hola.

Tengo la siguiente base de datos:
Base de datos




[cerrar]

El enunciado del problema a resolver es el siguiente:
Citar
Obtener el dorsal y el nombre de los ciclistas tales que todas las etapas que
han ganado tienen más de 170 km (es decir que sólo han ganado etapas de
más de 170 km).

He probado con la siguiente consulta:
Código: [Seleccionar]
SELECT C.nombre, C.dorsal, COUNT(*)
FROM ciclista C JOIN etapa E USING(dorsal)
WHERE E.netapa not in (SELECT netapa FROM etapa WHERE km <= 170)
GROUP BY C.nombre
HAVING COUNT(*) = (SELECT count(*) FROM etapa WHERE km > 170);

Pero claro esto no me sirve puesto que a pesar de que cuenta a aquellos ciclistas que han ganado etapas con más de $$170KM$$, no tiene en cuenta que estos también han podido ganar etapas con menos de $$170KM$$. He pensado que podría hacer una consulta en la que obtenga el conjunto de aquellos ciclistas que han ganado etapas con más de $$170KM$$ y restarle el conjunto de los ciclistas que solo han ganado etapas de menos de $$170KM(*)$$, ¿funcionaría esto?¿Tiene alguien alguna otra idea?

Código con diferencia de conjuntos (*)
Código: [Seleccionar]
SELECT C.nombre, C.dorsal
FROM ciclista C JOIN etapa E USING(dorsal)
WHERE E.km > 170
MINUS
SELECT C2.nombre, C2.dorsal
FROM ciclista C2 JOIN etapa E2 USING(dorsal)
WHERE E2.km <= 170
[cerrar]

Mucha gracias de antemano.
Un saludo.

08 Marzo, 2022, 05:43 pm
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 2,319
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola , me parece mas fácil este código ya que no te piden que cuentes las etapas ganadas.



Código: [Seleccionar]
SELECT C.nombre, C.dorsal
FROM ciclista C JOIN etapa E USING(dorsal)
WHERE E.dorsal not in (SELECT dorsal FROM etapa WHERE km <= 170)
 and etapa.km > 170;


Saludos
Saludos  \(\mathbb {R}^3\)

09 Marzo, 2022, 02:09 am
Respuesta #2

w a y s

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 255
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
  • I
Hola Richard R Richard,

si tienes razón tu código es más sencillo, lo de la cuenta era para identificar que el número de etapas que había ganado un corredor fuera el mismo que el de etapas de más de $$170KM$$, de igual forma eso no resolvía el problema. Muchas gracias por tu aporte.

Saludos.