Zadania z PSQL

0

Dzień dobry forumowicze.
Dostałem do zrobienia kilka zadań z PSQL. Mam z nimi problem bo na uczelni dopiero zaczynamy przygodę z Postgresem i mamy na nie bardzo mało czasu. Za wszelką pomoc związaną z rozwiązaniem zadań będę bardzo wdzięczny.

W załączniku umieszczam skrypt tworzący bazę.
Zadania:
1.Dla każdego z klubów wypisać jego nazwę oraz nazwisko i wagę najlżejszego i najcięższego zawodnika.
2.Wypisać nazwiska bokserów, którzy nie przegrali żadnej walki.
3.Wypisać nazwiska bokserów z liczbą ich zwycięstw, w każdej kategorii wagowej.
4.Wypisać nazwy klubów z liczbą zwycięstw ich zawodników.
5.Dla każdego klubu wypisać maksymalną liczbę zwycięstw jednego zawodnika tego klubu.
6.Wypisać kategorie wagowe, w których nie występował żaden bokser.
7.Wypisać nazwy klubów, w których nikt nie walczy.
8.Wypisać tych zawodników, dla których imiona i nazwiska są takie same, ale wartości indentyfikatorów są różne.
9.Wypisać nazwy klubów, których zawodnicy wygrali ponad 20% wszystkich walk.

0

Na forum nie robimy gotowców. Jeżeli masz konkretne pytania o konkretne problemy, to je zadaj, w innym wypadku załóż wątek w ogłoszeniach drobnych i zaoferuj wynagrodzenie.

0

Na chwilę obecną mam problem w zadaniu 1. Mam następujący kod:
select k.nazwa_klub, b.nazwisko, b.waga
from b_bokser b join b_klub k on b.id_klub=k.id_klub
where b.waga=(SELECT MAX(waga) FROM b_bokser) or b.waga=(SELECT MIN(waga) FROM b_bokser);
Wypisuje najcięższego oraz najlżejszego zawodnika z klubów. Problem pojawia się taki, że w dwóch klubach zawodnicy mają taką samą wagę i kod nie wypisuje nic. Jest jakiś prosty sposób żeby to obejść?

0
ErnestoSilniesto napisał(a):

Na chwilę obecną mam problem w zadaniu 1. Mam następujący kod:
select k.nazwa_klub, b.nazwisko, b.waga
from b_bokser b join b_klub k on b.id_klub=k.id_klub
where b.waga=(SELECT MAX(waga) FROM b_bokser) or b.waga=(SELECT MIN(waga) FROM b_bokser);
Wypisuje najcięższego oraz najlżejszego zawodnika z klubów. Problem pojawia się taki, że w dwóch klubach zawodnicy mają taką samą wagę i kod nie wypisuje nic. Jest jakiś prosty sposób żeby to obejść?

 b.waga=(SELECT MIN(waga) FROM b_bokser)

To zwraca Ci najmniejszą wagę spośród wszystkich bokserów, a nie bokserów z danego klubu.

Powinieneś uwzględnić ID klubu przy wyszukiwaniu min/max wagi.

 b.waga=(SELECT MIN(waga) FROM b_bokser b2 where b2.id_klub=k.id_klub)
0

W pierwszej przymiarce zrobilbym tak (zakłądając, że silnik wspiera funkcje analityczne):

with zawodnicy as (
select 
    /* kazdego zawodnika flagujemy, czy jest "min" (min_flag=1) czy moze "max" (max_flag=1) */ 
	t.nazwa_klub,
	t.nazwisko,
	t.waga, 
	decode(rn_min,1,1,null) min_flag,
	decode(rn_max,1,1,null) max_flag
from 
(
  /* a) Listujemy kluby wraz z zawodnikami
     b) w ramach klubu numerujemy zawodnikow na 2 sposoby:
		b1) wg wagi rosnaco (rn_min)
		b2) wg wagi malejaco (rn_max)
     c) wybieramy zawodnikow z etykietka "1" (tj. albo ma najmniejsza wage, albo najwieksza)
   */ 
  select 
    k.nazwa_klub, 
	b.nazwisko,
	b.waga,
	row_number() over (partition by b.id_klub order by waga) rn_min,
	row_number() over (partition by b.id_klub order by waga desc) rn_max
  from 
	b_bokser b, 
	b_klub k
  where 
    b.id_klub=k.id_klub
) where rn_min=1 or rn_max=1)
select 
    /* pivot danych z CTE "zawodnicy" */
	z.nazwa_klub,
	max(case when min_flag=1 then nazwisko else null) min_nazwisko,
	max(case when min_flag=1 then waga else null) min_waga,
	max(case when max_flag=1 then nazwisko else null) max_nazwisko,
	max(case when max_flag=1 then waga else null) max_waga
from zawodnicy z group by z.nazwa_klub;

Jak nie wspiera, to pewnie UNION "zawodnicy z min waga w klubach" + "zawodnicy z max. waga w klubach" + pivot.

1 użytkowników online, w tym zalogowanych: 0, gości: 1