Cały dzień 2 (Szkolenie programowanie .Net C# / SQL Warszawa)

cały dzień 2

select * from zawodnicy

select * from trenerzy

select imie_t, nazwisko_t, 
IIF(data_ur_t is null,'brak',format(data_ur_t,'dd-MM-yyyy'))
from trenerzy

select imie_t, nazwisko_t,
	coalesce(format(data_ur_t,'dd-MM-yyyy'),'brak')
from trenerzy

select coalesce(null,null,2)

select imie_t,nazwisko_t,data_ur_t,
	coalesce( 
			format(data_ur_t,'dd-MM-yyyy'),
			nazwisko_t,
			imie_t) 
from trenerzy

select CHOOSE(6,'a','b','c','d','e')

-- dla każdego zwodnika wypisz słownie 
--z ilu liter skłąda się jego imie, korzystając z choose
--uwzględnij przypadki od 1 do 5, dla pozostałych zwróć null

select imie, 
	CHOOSE(len(imie),'jeden','dwa','trzy','cztery','piec'),
	case len(imie)
		when 1 then 'jeden'
		when 2 then 'dwa'
		when 3 then 'trzy'
		when 4 then 'cztery'
		when 5 then 'piec'
	end
from zawodnicy


select * from zawodnicy

select * from trenerzy


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

select z.imie, z.nazwisko
from zawodnicy z

select zawodnicy.imie, zawodnicy.nazwisko
from zawodnicy 

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

 
 select * from zawody
 select * from skocznie

 -- wypisz wszystkie skocznie wraz z zawodami, 
--  odbywajacymi się na tych skoczniach 

select s.nazwa_skoczni, z.nazwa
from skocznie s left join zawody z on s.id_skoczni= z.id_skoczni
where s.id_skoczni is not null

-- wypisz wszystkie pary: zawodnik-skocznia z tego samego kraju

select z.imie, z.nazwisko, s.nazwa_skoczni, s.kraj_skoczni
from zawodnicy z join skocznie s on z.kraj = s.kraj_skoczni

-- wypisz wszystkie pary: trener-zawodnik urodzonych w tym samym miesiącu:
    -- wersja a: trener i dowolny zawodnik
	-- wersja b: trener i zawodnik danego trenera

select z.imie, z.nazwisko, z.data_ur, t.imie_t, t.nazwisko_t, t.data_ur_t
from zawodnicy z join trenerzy t on MONTH(z.data_ur) = MONTH(t.data_ur_t)

select z.imie, z.nazwisko, z.data_ur, t.imie_t, t.nazwisko_t, t.data_ur_t
from zawodnicy z join trenerzy t 
		on MONTH(z.data_ur) = MONTH(t.data_ur_t) and
		z.id_trenera = t.id_trenera

-- cwiczenia: str 26 

select *
from zawodnicy where id_trenera is null

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

select z.imie, z.nazwisko, t.imie_t, t.nazwisko_t
from zawodnicy z join trenerzy t on LEFT(z.imie,1) = LEFT(t.imie_t,1)

select z1.imie, z1.nazwisko , z1.wzrost, z2.imie, z2.nazwisko, z2.wzrost, z1.kraj
from zawodnicy z1 join zawodnicy z2 on z1.kraj= z2.kraj 
	where z1.wzrost > z2.wzrost
order by z1.wzrost


-- wypisz zawodnikow i zawody 

select * from zawodnicy
select * from zawody
select * from uczestnictwa

select z.imie, z.nazwisko, zaw.nazwa
from zawodnicy z left join uczestnictwa u on z.id_zawodnika= u.id_zawodnika
                 left join zawody zaw on zaw.id_zawodow = u.id_zawodow

-- dla kazdego trenera wypisz miasta jakie musiał odwiedzić w czasie swojej kariery


select distinct t.imie_t, t.nazwisko_t,  replace(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 zaw on zaw.id_zawodow = u.id_zawodow
				left join skocznie s on s.id_skoczni = zaw.id_skoczni
				left join miasta m on m.id_miasta = s.id_miasta
where t.id_trenera is not null


-- wypisz trenerów i zawodników urodzonych tak, 
--że jeden trener urodzony jest dzień tygodnia wcześniej
-- od zawodnika: np: trener w poniedziałek a zawodnik we wtorek 

select FORMAT(data_ur,'d') , DATEPART(dw,data_ur) from zawodnicy

select t.imie_t, t.nazwisko_t, z.imie, z.nazwisko,DATEPART(dw,z.data_ur),DATEPART(dw,t.data_ur_t)
from trenerzy t join zawodnicy z on 
	DATEPART(dw,t.data_ur_t)= iif(DATEPART(dw,z.data_ur)-1=0,7,DATEPART(dw,z.data_ur)-1)  

select distinct kraj from zawodnicy


select kraj
from zawodnicy --join
--where
group by 
--order by 

go;

select kraj, waga, sum(wzrost), AVG(waga),MIN(data_ur), SUM(waga), COUNT(waga)
from zawodnicy 
group by kraj, waga

-- kolumna, która nie jest grupowana MUSI być zagregowana
select * from zawodnicy
select kraj, COUNT(nazwisko),COUNT(imie),COUNT(id_trenera)
from zawodnicy
group by kraj

select kraj, COUNT(*)
from zawodnicy
group by kraj

select* from zawodnicy


-- str 20 grupowanie 

select kraj , COUNT(*)
from zawodnicy
group by kraj

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

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

select kraj, AVG(wzrost)
from zawodnicy
group by kraj
order by AVG(wzrost)


select kraj , count(IIF(wzrost>180,1,null)) wys , SUM(IIF(wzrost<175,1,0)) nis 
from zawodnicy
group by kraj

-- dodatkowe:
-- dla każdego zawodnika wypisz w ilu zawodach startował

select z.imie, z.nazwisko, COUNT(u.id_uczestnictwa)
from zawodnicy z left join uczestnictwa u on u.id_zawodnika = z.id_zawodnika
group by z.id_zawodnika, imie, nazwisko
order by COUNT(u.id_uczestnictwa) desc

-- pogrupuj zawodników po pierwszej literce imienia i wyświetl ilu ich jest

select LEFT(imie,1), COUNT(*)
from zawodnicy 
group by LEFT(imie,1)

-- podaj ilu zawodników urodziło się w poszczególnych dniach --tygodnia( pon, wt... niedz) 
-- posortuj malejąco
select FORMAT(data_ur,'dddd'),  DATEPART(dw,data_ur), COUNT(*)
from zawodnicy 
group by FORMAT(data_ur,'dddd'), DATEPART(dw,data_ur)
order by  DATEPART(dw,data_ur) desc


select kraj, AVG(wzrost)
from zawodnicy	
--where wzrost > 175
group by kraj
having AVG(wzrost)>175


-- str 20 
-- wypisz trenerów, którzy trenują od 2 do 4 zawodników 

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

select t.nazwisko_t, COUNT(*)
from trenerzy t left join zawodnicy z 
	on t.id_trenera = z. id_trenera
group by t.nazwisko_t
having COUNT(*) between 2 and 4 


-- podzapytania 

select imie, nazwisko, waga
from zawodnicy


			select imie, nazwisko, w
			from    (select imie, nazwisko, waga , waga+1 w
					from zawodnicy) t
-- 1 podzapytania w sekcji from
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 from zawodnicy
-- podzapytania w sekcji select 
select imie, nazwisko, (select max(wzrost) from zawodnicy) t
from zawodnicy

 select imie, nazwisko, 
	(select nazwisko_t from trenerzy tt where tt.id_trenera=z.id_trenera) t
from zawodnicy z

-- podzapytania w sekcji where

select imie, nazwisko, wzrost
from zawodnicy
where wzrost > (select AVG(wzrost) wzrost from zawodnicy)

select AVG(wzrost) wzrost from zawodnicy

-- wypisz tylko tych zawodnikow, ktorych wzrost jest wiekszy niz srednia
-- wzrostu z tego samego kraju co zawodnik
select imie, nazwisko, wzrost
from zawodnicy z2
where wzrost > (select AVG(wzrost) wzrost from zawodnicy z1 where z1.kraj=z2.kraj)

-- podzapytania + filtrowanie + zlaczenia + grupowanie + having

select *
from zawodnicy
where wzrost = (select MAX(wzrost) from zawodnicy)

select *
from zawodnicy
where waga >  (select avg(waga) from zawodnicy)

select *
from zawodnicy
where waga >=  any(select waga from zawodnicy)

-- wypisz tylko tych zawodnikow, których wzrost jest wiekszy od wszystkich wzrostów polakow
select *
from zawodnicy	
where wzrost >  all(select wzrost from zawodnicy where kraj = 'pol')
-- wypisz tych zawodnikow , ktorych wzrost jest taki sam jak wzrost polakow 
select *
from zawodnicy	
where wzrost in (select wzrost from zawodnicy where kraj = 'ger')


-- 1) sprawdź w ilu zawodach uczestniczył każdy zawodnik
	select imie, nazwisko, (select COUNT(*) from uczestnictwa u where z.id_zawodnika=u.id_zawodnika)
	from zawodnicy  z

-- 2) stwórz tabliczkę mnożenia od 1 do 100, każdy wiersz to jedno równanie 1x1=1; 1x2=2...... 9x9=81 ...10x10=100
	select format(a.id_zawodnika,'0') + 'x' +  format(b.id_zawodnika,'0') + ' = ' +  format(a.id_zawodnika*b.id_zawodnika,'0')
	 from 
		(select id_zawodnika
		from zawodnicy where id_zawodnika < 11) a
			full join 
		(select id_zawodnika
				from zawodnicy where id_zawodnika < 11) b on a.id_zawodnika <> b.id_zawodnika or a.id_zawodnika =b.id_zawodnika

	select z.imie, z.nazwisko, t.imie_t, t.nazwisko_t
	from zawodnicy z cross join trenerzy t  

	select z.imie, z.nazwisko, t.imie_t, t.nazwisko_t, zaw.nazwa
	from zawodnicy z , trenerzy t  , zawody zaw

-- 3) wypisz wszystkie dni tygodnia (od poniedziałku do niedzieli po polsku i dla każdego dnia tygodnia napisz 
-- ilu trenerów i ilu zawodników (w osobnych kolumnach urodziło się danego dnia)  
	select p.dz,p.trenerzy,count(o.dz) zawodnicy
	 from
		(select a.dz, COUNT(b.dz) trenerzy
		 from 
			 (select FORMAT( DATEFROMPARTS(2000,1, id_zawodnika+2),'dddd','pl-pl') dz
			 from zawodnicy where id_zawodnika < 8) a
			 left join
			 (select FORMAT(data_ur_t,'dddd','pl-pl') dz
			 from trenerzy) b
			 on a.dz = b.dz
		  group by a.dz) p
		left join
		(select FORMAT(data_ur,'dddd','pl-pl') dz
		from zawodnicy) o
		on p.dz=o.dz
	group by p.dz,p.trenerzy


	select FORMAT(DATEFROMPARTS(2000,1,p.dz+2),'dddd','pl-pl'),p.trenerzy,count(o.dz) zawodnicy
	 from
		(select a.dz, COUNT(b.dz) trenerzy
		 from 
			 (select datepart(DW, DATEFROMPARTS(2000,1, id_zawodnika+2)) dz
			 from zawodnicy where id_zawodnika < 8) a
			 left join
			 (select datepart(DW, data_ur_t) dz
			 from trenerzy) b
			 on a.dz = b.dz
		  group by a.dz) p
		left join
		(select datepart(DW,data_ur) dz
		from zawodnicy) o
		on p.dz=o.dz
	group by p.dz,p.trenerzy














-- 4) wypisz ilu zawodników skakało na danej skoczni -- wypisz tylko te skocznie gdzie skakało więcej niż 
   -- 2 zawodników, posortuj wg. liczby zawodników
	
	select s.nazwa_skoczni, count(u.id_zawodnika)
	from skocznie s left join zawody zaw on s.id_skoczni=zaw.id_skoczni
					left join uczestnictwa u on u.id_zawodow = zaw.id_zawodow
    where s.nazwa_skoczni is not null
	group by s.nazwa_skoczni
	having COUNT(u.id_zawodnika) > 2
	order by COUNT(u.id_zawodnika) 

-- 5) dla każdego miasta wypisz kiedy odbyły się pierwsze zawody , jeżeli nie odbyły się nigdy napisz: brak danych
	
	
	select m.nazwa_miasta, coalesce( format(min(z.data),'dd-MM-yyyy'),'bd') data 
		 
	from miasta m left join skocznie s on m.id_miasta= s.id_miasta
				  left join zawody z on z.id_skoczni = s.id_skoczni
	group by m.nazwa_miasta
	order by  coalesce(min(z.data),(select dateadd(d,1,MAX(data)) from zawody) )

-- 6) dla każdego trenera wypisz kraj, na podstawie kraju jego zawodników 

	select distinct t.nazwisko_t, z.kraj
	from trenerzy t left join zawodnicy z on z.id_trenera = t.id_trenera	
	where z.kraj is not null


-- 7) wypisz trenerów młodszych niż jego zawodnicy

	select t.*
	from trenerzy t where data_ur_t> (select MIN(data_ur) from zawodnicy z where z.id_trenera=t.id_trenera) 

	
-- 8) wskaz wszystkich zawodnikow, których wzrost jest drugi co do wielkości
	
	select imie, nazwisko, wzrost from zawodnicy 
	 where wzrost = 
		(select MAX(wzrost) from zawodnicy
			where wzrost < 
			( select MAX(wzrost)
			 from zawodnicy ))

 
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 and wzrost <= 178



select imie, nazwisko ,kraj
from zawodnicy
union 
select imie_t, nazwisko_t, (select distinct kraj from zawodnicy where id_trenera = t.id_trenera and kraj is not null)
from trenerzy t 


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

select * from zawodnicy where wzrost  =
(select MAX(wzrost) from 
	(select wzrost from zawodnicy
	except
	select max(wzrost)
	from zawodnicy) t )


	/*
Z zawodników wypisz 3 kolumny: imie, nazwisko i typ wzrostu, 
którzy przyjmuje tylko 3 wartości:  niski lub średni lub wysoki.
wartości czy ktoś jest niski śrendni czy wysoki powinny być dobrane automatycznie
przez podzielenie na równo przedziału wartości wzrostów 
*/

select  (max(wzrost) - MIN(wzrost))/3.0
from zawodnicy


select imie, nazwisko, wzrost, 'niski'
from zawodnicy	
	where wzrost <  
			(select MIN(wzrost) from zawodnicy) + (select  (max(wzrost) - MIN(wzrost))/3.0 from zawodnicy)

union
select imie, nazwisko, wzrost, 'średni'
from zawodnicy	
	where wzrost <=  
			(select MIN(wzrost) from zawodnicy) + 2* (select  (max(wzrost) - MIN(wzrost))/3.0 from zawodnicy)
		and wzrost >= (select MIN(wzrost) from zawodnicy) + (select  (max(wzrost) - MIN(wzrost))/3.0 from zawodnicy)
union
select imie, nazwisko, wzrost, 'wysoki'
from zawodnicy	
	where wzrost >  
			(select MIN(wzrost) from zawodnicy) + 2*(select  (max(wzrost) - MIN(wzrost))/3.0 from zawodnicy)