Baza Danych- ekstraklasa


(Macbaz) #1

Witam

Projektuje bazę danych , która będzie miala za zadanie przechowywać wyniki klubów tzn zdobyte bramki, punkty. Jaki zawodnik nalezy do jakiego klubu, ile strzelil bramek.

ekstraklasao.jpg

I tu moje pytanie jak polaczyc relacja tabele aby KlubBramki z tabeli Klub sumowaly zdobyte bramki IdKliubGospodarze BramkiGospodarze/ IdKlubGoscie BramkiGoscie. Mam powiazane relcja IdKlub z IdKlubGospodarze i IdKlub z IdKlubGoscie. Ale jak powiazac te zdobyte bramki z Id poszczegolnego Klubu. zeby wynik pojawialy sie w tabeli Klub w oknie KlubBramki.

mecza.th.jpg

Uploaded with ImageShack.us

-- Dodane 15.04.2011 (Pt) 16:17 --

Albo jak można zrobić powiązania IdKlub ze zdobytymi bramkami w poszczegolnym meczu?


(Tomek Matz) #2

Kolumny KlubPunkty i KlubBramki to nie są zwykłe dane, ale wartości obliczeń. Powiązać ot tak się tego nie da. Jest coś takiego jak computed columns i być może w ten sposób mógłbyś to rozwiązać (choć pewności nie mam), ale ja takiego rozwiązania bym nie użył. Widzę dwie opcje:

  1. spróbować stworzyć trigger -a, który w momencie gdy pojawi się nowy rekord w tabeli Mecz wykona odpowiednie instrukcje SQL i zaktualizuje kolumny KlubPunkty i KlubBramki w tabeli Klub.

  2. wywalić kolumny KlubPunkty i KlubBramki z tabeli Klub i stworzyć perspektywę ( view ) Klub, która będzie umożliwiała odczytanie tych danych (tam te kolumny będą widoczne). Coś podobnego robiłem ostatnio tutaj http://forum.dobreprogramy.pl/baza-danych-rozgrywek-t440973.html.

EDIT: Zapytanie, które użyłbyś do stworzenia perspektywy może być następujące:

SELECT temp.IdKlub, temp.KlubNazwa, temp.KlubBarwa,

	SUM(temp.BramkiStrzelone) AS BramkiStrzelone,

	SUM(temp.BramkiStracone) AS BramkiStracone,

	SUM(temp.Wygrana) AS Wygrane,

	SUM(temp.Remis) AS Remisy,

	SUM(temp.Przegrana) AS Przegrane,

	Punkty = SUM(temp.Remis) + SUM(temp.Wygrana) * 3

FROM (

	SELECT k.IdKlub, k.KlubNazwa, k.KlubBarwa,

		   BramkiStrzelone = CASE 

				WHEN m.IdKlubGospodarze = k.IdKlub THEN m.BramkiGospodarze

				ELSE m.BramkiGoscie

		   END,

		   BramkiStracone = CASE 

				WHEN m.IdKlubGospodarze = k.IdKlub THEN m.BramkiGoscie

				ELSE m.BramkiGospodarze

		   END,

		   Wygrana = CASE

				WHEN (m.IdKlubGospodarze = k.IdKlub AND m.BramkiGospodarze > m.BramkiGoscie) OR 

					 (m.IdKlubGoscie = k.IdKlub AND m.BramkiGoscie > m.BramkiGospodarze) THEN 1

				ELSE 0

		   END,

		   Remis = CASE

				WHEN (m.IdKlubGospodarze = k.IdKlub OR m.IdKlubGoscie = k.IdKlub ) AND 

					  m.BramkiGospodarze = m.BramkiGoscie THEN 1

				ELSE 0

		   END,

		   Przegrana = CASE

				WHEN (m.IdKlubGospodarze = k.IdKlub AND m.BramkiGospodarze < m.BramkiGoscie) OR 

					 (m.IdKlubGoscie = k.IdKlub AND m.BramkiGoscie < m.BramkiGospodarze) THEN 1

				ELSE 0

		   END

	FROM Mecz AS m, Klub AS k

	WHERE m.IdKlubGospodarze = k.IdKlub OR m.IdKlubGoscie = k.IdKlub

) AS temp

GROUP BY temp.IdKlub, temp.KlubNazwa, temp.KlubBarwa

Daj znać, na które rozwiązanie się zdecydujesz oraz gdy będziesz miał z nim jakieś problemy.