Dzień 2 (Szkolenie / SQL Kraków)

select * from zawodnicy

select * from trenerzy

select * from skocznie
select * from miasta

select imie,nazwisko, imie_t, nazwisko_t
from zawodnicy left join trenerzy 
	on zawodnicy.id_trenera = trenerzy.id_trenera


select z.imie,z.nazwisko ,z.id_trenera, 
	   t.imie_t, t.nazwisko_t, t.id_trenera
from zawodnicy z left join trenerzy t
	on z.id_trenera = t.id_trenera

select imie, nazwisko, imie_t,nazwisko_t
from zawodnicy cross join trenerzy

-- 1) wpisz wszystkie miasta i informacje jakie skocznie
    -- się na w nich znajdują 

	select m.*, s.*
	from miasta m left join skocznie s 
		on m.id_miasta = s.id_miasta
 
-- 2) wypisz zawodnikow i skocznie z tego samego kraju

   select * from zawodnicy

   select * from skocznie

   select *
   from zawodnicy z join skocznie s on
	z.kraj = s.kraj_skoczni	



select * from zawody

select * from skocznie


select m.nazwa_miasta, z.nazwa
from miasta m join skocznie s on m.id_miasta=s.id_miasta
     join zawody z on z.id_skoczni = s.id_skoczni

--1)  wypisz wszystkich zawodnikow, wraz z nazwami zawodów

select z.imie, z.nazwisko, zw.nazwa
from zawodnicy z left join uczestnictwa u 
		on z.id_zawodnika = u.id_zawodnika
	 left join zawody zw on zw.id_zawodow=u.id_zawodow
--2) wypisz	nazwy skoczni w jakich skakali poszczególni 
    -- zawodnicy

select s.nazwa_skoczni, z.imie + ' ' + z.nazwisko
from skocznie s left join zawody zw on s.id_skoczni=zw.id_skoczni
     left join uczestnictwa u on u.id_zawodow = zw.id_zawodow
	 left join zawodnicy z on z.id_zawodnika = u.id_zawodnika
	 where nazwa_skoczni is not null
--3) wypisz ternerów i zawodników urodzonych w tym samym 
   -- miesiacu 
   select z.imie, z.nazwisko, z.data_ur, 
		  t.imie_t, t.nazwisko_t, t.data_ur_t
   from trenerzy t join zawodnicy z on 
		MONTH(t.data_ur_t) = MONTH(z.data_ur)

--4) wypisz pary zawodnikow urodzonych tego samego dnia 
    -- tygodnia i z tego samego kraju (są tacy?) 

select z1.imie, z1.nazwisko,format(z1.data_ur ,'ddd'),z1.kraj,
       z2.imie, z2.nazwisko,format(z2.data_ur ,'ddd'), z2.kraj
from zawodnicy z1 join zawodnicy z2 on
	  z1.kraj = z2.kraj and 
	format(z1.data_ur ,'ddd')= format(z2.data_ur,'ddd')
	  --and z1.nazwisko != z2.nazwisko
	  and z1.id_zawodnika > z2.id_zawodnika

--5) wypisz trenerów i miasta jakie musieli odwiedzić 

select distinct t.nazwisko_t, m.nazwa_miasta
from trenerzy t left join zawodnicy z 
		on t.id_trenera = z.id_trenera
	left join uczestnictwa u on u.id_zawodnika = z.id_zawodnika
	left join zawody zw on zw.id_zawodow = u.id_zawodow
	left join skocznie s on s.id_skoczni = zw.id_skoczni
	left join miasta m on m.id_miasta = s.id_miasta

select distinct kraj from zawodnicy

select z.*
from zawodnicy z left join trenerzy t on z.id_trenera = t.id_trenera
where z.id_trenera is null

select * from zawodnicy where id_trenera is null

select *
from trenerzy t left join zawodnicy z on z.id_trenera = t.id_trenera
	where z.id_trenera is null


select z1.imie,z1.nazwisko,z1.kraj , z2.imie, z2.nazwisko,z2.kraj,		
		z1.wzrost , z2.wzrost
from zawodnicy z1 join zawodnicy z2 on 
		z1.kraj = z2.kraj and z1.wzrost>z2.wzrost

-- wypisz pary zawodnik-trener , ktorych nazwisko zaczyna na 
-- te sama litere 
	
select z.nazwisko, t.nazwisko_t
from zawodnicy z join trenerzy t on 
		left(z.nazwisko,1)= left(t.nazwisko_t,1)



select distinct kraj, wzrost from zawodnicy

select kraj ,sum( wzrost) , avg(wzrost), min(wzrost), STDEV(wzrost)
from zawodnicy
group by kraj

select kraj , waga,sum(wzrost) , avg(wzrost), min(wzrost), STDEV(wzrost),
	count(wzrost)
from zawodnicy
group by kraj, waga


select kraj,count(waga),count(Wzrost), count(nazwisko), count(id_trenera)
from zawodnicy
group by kraj
 

 select kraj, count(kraj)
 from zawodnicy
 group by kraj

 select kraj, max(wzrost)
 from zawodnicy
 group by kraj 


 select kraj, count(wzrost)
 from zawodnicy
 where wzrost>  180
 group by kraj


 select kraj, avg(wzrost)
 from zawodnicy
 group by kraj


 select kraj, sum(iif(wzrost>180,1,0)) wys, sum(iif(wzrost<175,1,0)) nis
 from zawodnicy
 group by kraj

 select kraj_skoczni, count(kraj_skoczni), count(*) from skocznie
 where kraj_skoczni is null
 group by kraj_skoczni



 select kraj, sum(wzrost)
 from zawodnicy
 group by kraj


 select sum(wzrost) from zawodnicy

 select kraj, sum(wzrost)
 from zawodnicy 
 group by rollup(kraj)

 -- dla kazdego zawodnika wypisz pore roku w jakiej sie urodzil
 -- pory roku okresl na podstawie miesiecy np: 12,1,2 to zima itd...

 select kraj, 
		case
			when MONTH(data_ur) in (12,1,2) then 'zima'
			when MONTH(data_ur) between 3 and 5 then 'wiosna'
			when MONTH(data_ur) between 6 and 8 then 'lato'
			else 'jesien'
		end , avg(wzrost)
 from zawodnicy
 group by cube(kraj, case
			when MONTH(data_ur) in (12,1,2) then 'zima'
			when MONTH(data_ur) between 3 and 5 then 'wiosna'
			when MONTH(data_ur) between 6 and 8 then 'lato'
			else 'jesien'
		end)


select kraj, avg(wzrost)
from zawodnicy 
group by kraj
having avg(wzrost) >= 180


select kraj , count(wzrost)
from zawodnicy
where wzrost >180
group by kraj 
having count(kraj)>1

-- 1) Wypisz zawodnikow raz z informacja ile razy startowali w zawodach 
   select z.imie, z.nazwisko, count(w.nazwa)
   from zawodnicy z left join uczestnictwa u on u.id_zawodnika=z.id_zawodnika
	 left join zawody w on w.id_zawodow = u.id_zawodow
	group by imie,nazwisko
-- 2) wypisz tylko te miasta, w których startowało przynajmniej 3 zawodnikow
	select m.nazwa_miasta, COUNT( u.id_zawodnika)
	from miasta m left join skocznie s on m.id_miasta = s.id_miasta
	     left join zawody w on w.id_skoczni = s.id_skoczni
		 left join uczestnictwa u on u.id_zawodow = w.id_zawodow
	group by nazwa_miasta
	having  COUNT( u.id_zawodnika)>2

	select m.nazwa_miasta, COUNT( u.id_zawodnika)
	from miasta m join skocznie s on m.id_miasta = s.id_miasta
	      join zawody w on w.id_skoczni = s.id_skoczni
		  join uczestnictwa u on u.id_zawodow = w.id_zawodow
	group by nazwa_miasta
 
  
-- 3) wypisz trenerów, którzy trenują przyjnamniej 2 zawodników 
   -- których wzrost wynosi ponizej 175

   select t.imie_t, t.nazwisko_t, count(z.nazwisko)
   from trenerzy t left join zawodnicy z on t.id_trenera = z.id_trenera
   where z.wzrost <175
   group by t.imie_t, t.nazwisko_t
   having count(z.nazwisko) > 1

    
-- 4) zrób zestawienie, w którym wyświetlisz, dla kazdego kraju 
	-- maksymalny punkt k skoczni oraz informację jaki jest maksymalny
	-- punkt k dla wszystkich krajow , jednoczesnie
	-- nie uwzględniaj pustych wierszy 
	select kraj_skoczni, max(k)
	from skocznie
	where kraj_skoczni is not null
	group by rollup(kraj_skoczni)
	

-- 5) sprawdź ile razy trener polaków odwiedził miasta, które nie 
      -- zawierają w swojej nazwie liter "g" 

 select t.nazwisko_t, count(m.nazwa_miasta)
 from trenerzy t left join zawodnicy z on t.id_trenera = z.id_trenera
			left join uczestnictwa u on u.id_zawodnika = z.id_zawodnika
			left join zawody w on w.id_zawodow = u.id_zawodow
			left join skocznie s on s.id_skoczni = w.id_skoczni
			left join miasta m on m.id_miasta = s.id_miasta
 where z.kraj = 'pol' and m.nazwa_miasta not like '%o%'
 group by nazwisko_t



 select imie, nazwisko
 from 
	 (select imie, nazwisko, kraj, waga+1 w
	 from zawodnicy) t
where  w>67

-- stworz zapytanie, ktore wyswietla imie, nazwisko 
 -- i bmi . nastepnie  w nowym selecie odwołaj się do 
 -- tego podzapytania i przefiltruj zawodników 
 -- po bmi > 20, wykorzystując alias bmi w where 

 select imie, nazwisko, format(bmi,'0.00')
 from
	 (select imie, nazwisko, 
		waga/power(wzrost/100.0,2) bmi
	 from zawodnicy) t 
where bmi > 20


 select imie, nazwisko, bmi
 from
	 (select imie, nazwisko, 
		format(waga/power(wzrost/100.0,2),'0.00') bmi
	 from zawodnicy) t 
where bmi > 20.00
select iif('210'<'22','tak','nie')
select imie, nazwisko, (select max(waga) from zawodnicy)  
from zawodnicy
select imie, nazwisko, (select waga from zawodnicy)
from zawodnicy
select imie, nazwisko, waga from zawodnicy
where waga > (select avg(waga) from zawodnicy) 
-- 3 rodzaje podzapytan
--1) w sekcji from: w nawiasy i nadac alias 
--2) w sekcji select: w nawiasy i mozna opcjonalnie nadac alias 
--3) w sekcji where: w nawiasy i nie mozna nadac aliasu 

 
 select imie, nazwisko, wzrost
 from zawodnicy
 where wzrost = (select max(wzrost) from zawodnicy)

 select imie, nazwisko, waga
 from zawodnicy
 where waga > (select avg(waga) from zawodnicy)

 select distinct kraj, imie, nazwisko from
	 (select imie, nazwisko, kraj
	 from zawodnicy
	 where waga > (select avg(waga) from zawodnicy)) t
 

 --1 zestawienie: dla kazdego kraju srednia waga
 select z.imie, z.nazwisko, z.kraj, z.waga, t.sr
 from zawodnicy z left join 
	 (select kraj,avg(waga) sr
	 from zawodnicy 
	 group by kraj) t on z.kraj=t.kraj 
 where z.waga>t.sr

 select * from
	 (select imie, nazwisko, kraj, waga,
		(select avg(waga) from zawodnicy t
			 where t.kraj=z.kraj group by kraj ) sr
	 from zawodnicy z) k
  where waga>sr
	

-- 1) wypisz trenerow mlodszych niż ich zawodnicy.
	select distinct imie_t, nazwisko_t
	from zawodnicy z right join trenerzy t on z.id_trenera = t.id_trenera
	where z.data_ur < t.data_ur_t 

-- 2) wypisz zawodnikow, którzy startowali rzadziej niż 
      -- średnia startów w ich drużynie 
select * from
	(select g.imie,g.nazwisko,g.[sr z kraju], count(u.id_zawodow) [liczbaSt]
	from
		(select w.id_zawodnika, w.imie, w.nazwisko, t.[sr z kraju] 
		from zawodnicy w left join 
			(select kraj, avg(u.id_zawodow) [sr z kraju] 
			from zawodnicy z left join uczestnictwa u on u.id_zawodnika =z.id_zawodnika
			group by kraj) t on t.kraj = w.kraj) g
		left join uczestnictwa u on u.id_zawodnika = g.id_zawodnika
	group by g.imie,g.nazwisko,g.[sr z kraju]) k
where liczbaSt<[sr z kraju]
-- 3) wypisz w kolumnie liczby od 1 do 10
	select id_zawodnika from zawodnicy where id_zawodnika<11

-- 4) zrób tabliczkę mnożenia w jednej kolumnie. Przykładowy 
		-- wynik to: 1x1=1
				--   1x2=2
				--   .....
				--   10x10=100
	
	select convert(varchar,a) + 'x' + convert(varchar,b) + '=' + convert(varchar,a*b)
	 from
		(select id_zawodnika a from zawodnicy where id_zawodnika<11) t1 cross join
		(select id_zawodnika b from zawodnicy where id_zawodnika<11) t2

 
select imie , nazwisko from zawodnicy where waga > 61
intersect
select imie, nazwisko from zawodnicy where wzrost > 178
 
select imie, nazwisko from zawodnicy where waga>61 and wzrost > 178

select imie , nazwisko from zawodnicy where waga > 61
union all
select imie, nazwisko from zawodnicy where wzrost > 178
 
select imie , nazwisko from zawodnicy where waga > 61
except
select imie, nazwisko from zawodnicy where wzrost > 178
 

select imie, nazwisko, kraj
from zawodnicy
union	
select imie_t, nazwisko_t, null
from trenerzy


select imie_t, nazwisko_t, kraj
from trenerzy t left join zawodnicy z on t.id_trenera=z.id_trenera
union
select imie, nazwisko, kraj from zawodnicy

select * from zawodnicy
select * from trenerzy



select * from zawodnicy
order by wzrost desc

select max(wzrost) from zawodnicy

select imie, nazwisko , wzrost from zawodnicy
where wzrost =

(select max(wzrost) from
	(select imie, nazwisko, wzrost from zawodnicy
	except
	select imie, nazwisko, wzrost
	from zawodnicy
	where wzrost = (select max(wzrost) from zawodnicy)) t)