Rozwiązanie
Zadanie 6.4 – matura 2015, maj

Zadanie 6.4 (0-3)

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. Dla każdego kraju, którego reprezentanci zdobywali punkty w sezonie 2012, podaj liczbę tych reprezentantów.
Już po pierwszym przeczytaniu czujemy, że w powietrzu unosi się zapach jakiegoś prostego podzapytania! A więc zacznijmy właśnie od niego. Wybierzmy id tych kierowców, którzy w roku 2012 punktowali. Do tego celu potrzebujemy dwóch tabel – wyniki, która określa liczbę uzyskanych punktów przez danego kierowcę – oraz Wyscigi przechowującej informacje o roku. W naszych warunkach określimy rok jako 2012 ORAZ ilość uzyskanych punktów większą niż 0. Całość pogrupujemy według id_kierowcy, gdyż treść naszego zadania bezpośrednio wskazuje na reprezentantów danego kraju! A faktem wiadomym jest, że jeśli Jan Kowalski jest reprezentantem Polski to jest on liczony jako jeden zawodnik, nie obchodzą nas informacje zduplikowane.SELECT wyniki.id_kierowcy
FROM (Wyniki INNER JOIN Wyscigi ON Wyniki.id_wyscigu = Wyscigi.id_wyscigu)
WHERE Rok = 2012 AND Punkty > 0
GROUP BY wyniki.id_kierowcyMając przygotowane zapytanie jesteśmy już na prostej do mety, pędzimy niczym Ci kierowcy!
Interesują nas informacje o liczbie kierowców z danego kraju, którzy uzyskali punkty w sezonie 2012. Mając podzapytanie właściwie pozostało nam skojarzyć id kierowców po ich narodowościach.

Ostatecznie:SELECT COUNT(kraj) AS Liczba, Kraj
FROM Kierowcy
WHERE id_kierowcy IN (
	SELECT wyniki.id_kierowcy
	FROM 
	(Wyniki
	INNER JOIN Wyscigi ON Wyniki.id_wyscigu = Wyscigi.id_wyscigu)
	WHERE Rok = 2012 AND Punkty > 0
	GROUP BY wyniki.id_kierowcy)
GROUP BY kraj;Objaśnienie:
Wybierz ilość wystąpień danego kraju (nazwa kolumny jako Liczba) oraz Kraj z tabeli Kierowcy gdzie id_kierowcy występuje w rekordach, które utworzyło nam nasze stworzone wcześniej podzapytanie! Następnie pogrupuj wszystkie informacje po kraju. Poskutkuje to ograniczeniem duplikatów nazw kraju do wartości jednokrotnej wraz z informacją o ilości jego reprezentantów.

Pobierz rozwiązanie
Wyszukaj więcej zadań z tego arkusza...