Rozwiązanie
Zadanie 6.1 – matura 2015, maj

Zadanie 6.1 (0-2)

Formuła 1
Formuła 1
W następujących plikach zgromadzono dane dotyczące wyścigów samochodowych Formuły 1 z lat 2000–2012. Pierwszy wiersz w każdym z plików jest wierszem nagłówkowym i zawiera nazwy pól.
W pliku Kierowcy.txt każdy wiersz zawiera informacje o kierowcy, rozdzielone średnikami: Id_kierowcy, Nazwisko, Imie, Kraj.
Przykład:
z10;Irvine;Eddie;Irlandia
W pliku Wyscigi.txt są zawarte informacje o rozegranych wyścigach Grand Prix liczonych do klasyfikacji generalnej: Id_wyscigu, Rok, GrandPrix. Sezon jest reprezentowany przez rok (czterocyfrowa liczba), a GrandPrix jest nazwą miejsca, w którym jest rozgrywany wyścig.
Przykład:
w20;2001;Brazylia
W pliku Wyniki.txt każdy wiersz zawiera informacje o punktach zdobytych przez kierowców w poszczególnych wyścigach, rozdzielone średnikami: Id_kierowcy, Punkty, Id_wyscigu.
Przykład:
z42;6;w7
Wykorzystując dane zawarte w plikach Kierowcy.txt, Wyscigi.txt i Wyniki.txt, wykonaj poniższe polecenia, a odpowiedzi poprzedzone numerem oznaczającym podpunkt zapisz w pliku wynik6.txt. Podaj sezon i nazwę wyścigu Grand Prix, w którym Robert Kubica zdobył najwięcej punktów.
Pierwszym etapem na jakim się skupimy jest wyznaczenie id_wyscigu, w którym Robert Kubica zdobył najwięcej punktów. W tym celu nasze operacje będą wykonywane na dwóch tabelach: Wyniki oraz Kierowcy. Wyniki zwrócą nam liczbę punktów uzyskanych przez kierowcę w danym wyścigu, zaś Kierowcy pozwolą nam określić z imienia i nazwiska na czyich rezultatach zależy nam najbardziej. Zapytanie będzie prezentowało się w następujący sposób:
SELECT TOP 1 id_wyscigu 
FROM Wyniki INNER JOIN Kierowcy ON Wyniki.Id_kierowcy = Kierowcy.id_kierowcy
WHERE imie = "Robert" AND nazwisko = "Kubica"
GROUP BY id_wyscigu
ORDER BY SUM(Punkty) DESCObjaśnienie:
Wybierz pierwszy zwrócony rekord z tabeli Wyniki połączonej relacją z tabelą Kierowcy, gdzie imię kierowcy to Robert ORAZ jego nazwisko to Kubica. Należy pamiętać o złączeniu warunków operatorem AND, gdyż zależy nam aby oba warunki zostały spełnione! Nasz zawodnik musi nazywać się Robert Kubica! Następnie pogrupujmy dane według id_wyscigu. Oznacza to nic innego jak ograniczenie wszystkich zwróconych rekordów o tym samym id_wyscigu do jednego pola. Teraz wystarczy już jedynie posortować nasze wyniki według sumy zwróconych punktów malejąco. 
Pierwsza część polecenia za nami. Teraz to już czysta przyjemność!
Mając id_wyscigu jesteśmy w stanie bezproblemowo podać informacje odnośnie roku i Grand Prix korzystając z tabeli Wyscigi, gdzie te są bezpośrednio identyfikowane z id_wyscigu.

Ostatecznie:
SELECT Rok, Grandprix
FROM Wyscigi
WHERE id_wyscigu IN (
	SELECT TOP 1 id_wyscigu FROM Wyniki
	INNER JOIN Kierowcy ON Wyniki.Id_kierowcy = Kierowcy.id_kierowcy
	WHERE imie = "Robert" AND nazwisko = "Kubica"
	GROUP BY id_wyscigu
	ORDER BY SUM(Punkty) DESC);
Objaśnienie:
Wybierz rok oraz Grand Prix z tabeli Wyscigi, gdzie id_wyscigu jest dokładnie takie samo jak zwrócony rekord z zapytania przygotowanego wyżej! 
 
Pobierz rozwiązanie
Wytłumaczenie pojawi się niebawem.
Wyszukaj więcej zadań z tego arkusza...