Dzien 2 skrypt (Szkolenie programowanie .Net C# / SQL Warszawa)

select * from trenerzy


select * 
from zawodnicy
order by kraj asc, waga desc, nazwisko

select imie, kraj, waga  
from zawodnicy
order by 2,3        -- niepoprawna technika

select imie, kraj, waga , left(imie,1) 
from zawodnicy
order by kraj,waga   , left(imie,1) 

-- str 10 , cw 7-12 


 select * from zawodnicy
 order by kraj

 select * from zawodnicy
 order by data_ur desc

 select imie + ' ' + nazwisko + ' (' + kraj + ')' from zawodnicy
 order by nazwisko

 SELECT * from trenerzy
 order by data_ur_t desc

 select * from zawodnicy
 order by waga / POWER(wzrost/100.0,2)

-- wypisz zawodnikow w kolejnosci pory roku w jakiej się urodzi a w obrębie danej pory
-- roku posortuj wg liczby złożonej z ostatniej cyfry wzrostu i id_zawodnika

select *,  right(wzrost,1)+ convert(varchar,id_zawodnika)
from zawodnicy
order by 
	case
		when MONTH(data_ur) >=3 and MONTH(data_ur)<=5 then 1 
		when MONTH(data_ur) between 6 and 8 then 2
		when MONTH(data_ur) in (9,10,11) then 3
		else 4
	end, convert(int, right(wzrost,1)+ convert(varchar,id_zawodnika))

--filtorwanie danych 

select 
from 
where -- tworzymy 1 (ewentualnie złożony) warunek 
order by 

go
 
select *, iif(kraj='pol','polska','inny')
from zawodnicy
where kraj = 'pol' or kraj='ger'

select *,iif(kraj='pol',1,0)
from zawodnicy
where left(kraj,1) = 'a' and ( and or )

-- str 11 cw 13-20 
select *
from zawodnicy
where kraj in ('ger' ,'aut')

select *
from zawodnicy
where waga/POWER(wzrost/100.0,2) <20

select * 
from zawodnicy
where DATEDIFF(yy,data_ur,getdate()) < 35

select * 
from zawodnicy
where len(imie) = 4

select * from trenerzy where data_ur_t is null


select * from zawodnicy where month(data_ur) in (1,2,3,11,12) 
select * from zawodnicy where month(data_ur) not between 4 and 10 

select * from zawodnicy	
where CHARINDEX('n',nazwisko)>0 or CHARINDEX('w',nazwisko)>0 

-- dodatkowe:
--1) wypisz tylko tych zawodników, którzy jescze nie mieli w tym roku urodzin
-- i posortuj w kolejności obchodzenia urodzin
select * from zawodnicy	
where GETDATE() < DATEFROMPARTS(year(getdate()),month(data_ur),day(data_ur))
order by month(data_ur), day(data_ur)

--2) wypisz tych zawodnikow, ktorzy mają pierwszą i ostatnią literę nazwiska taką samą
select * from zawodnicy
where left(nazwisko,1) = right(nazwisko,1)

------------------
-- grupowanie danych --
-- agragacja danych -- 

select len(imie)
 from zawodnicy

 select * from zawodnicy

select sum(waga), count(waga), count(imie), count(id_trenera), count(*)
 from zawodnicy

 select len(imie), sum(waga)
 from zawodnicy

 /* select | from | where | group by | order by */

 select kraj, waga, count(*), sum(wzrost) from zawodnicy
 group by kraj, waga

 /*
	 jeżeli grupuję po kolumnie {A,B..D} to mogę te kolumny wyświetlić w SELECT
	 jeżeli chcę wyświetlić kolumny {E,F,..G} to muszę je zagregować */ 

-- str 20 cw 37-41 


select  kraj, count(*)
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
order by avg(wzrost)

--41

select kraj , count(iif(wzrost>180,1,null)) wysc,
		      sum(iif(wzrost<175,1,0)) niscy
from zawodnicy
group by kraj

-- dodatkowe:
--1) pogrupuj zawdoników po pierwszej literce imienia i wyświetl ilu ich jest
	select left(imie,1), count(imie)
	from zawodnicy
	group by left(imie,1)

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

   select format(data_ur,'dddd') , DATEPART(dw,data_ur)
   from zawodnicy

   -- wypisz dla kazdego kraju srednia wzrostu 
   select kraj, avg(wzrost)
   from zawodnicy
   where wzrost > 171
   group by kraj


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

   --str 20 cw 43 

   select kraj , count(*)
   from zawodnicy
   where wzrost >=180
   group by kraj
   having count(*)>1
   
   -- podzapytania -- 
 select imie, nazwisko from  
   (select imie, nazwisko, wzrost
   from (select imie, nazwisko ,wzrost, waga+1 q
		from zawodnicy) t) w
 /* 1) podzapytanie musi mieć nawiasy i alias
    2) każda kolumna w podzapytaniu musi być jakkolwiek nazwana 
	3) możemy odwołać się tylko do kolumn, które zostały zdefiniowane w podzapytaniu
 */
 
 select imie, nazwisko , waga/POWER(wzrost/100.0,2) bmi 
 from zawodnicy
 where waga/POWER(wzrost/100.0,2)>=20
	
-- a gdybyśmy chcieli to samo zrobić z użyciem podzapytania ? 
-- bez definiowania drugi raz bmi? 					
select * from 
	(select imie, nazwisko , waga/POWER(wzrost/100.0,2) bmi 
	from zawodnicy) t 
where bmi >=20

/* podzapytania mogą być w:
 1) from - musimy definiować alias
 2) select - nie musimy definiować aliasu
 3) where  - nie musimy definiować aliasu 
*/

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

select imie , nazwisko , (select imie_t from trenerzy t where t.id_trenera=z.id_trenera )
from zawodnicy z
 -- str 28 , cw 51-53
-- 1) WYPISZ zawodnikow, ktroych waga jest wieksza od sredniej wagi wszystkich
    -- zawodnikow
	select *
	from zawodnicy
	where waga > (select AVG(waga) from zawodnicy)

-- 2) wypisz zawodnikow, ktorych waga jest wieksza od sredniej wagi zawodnikow
-- z kraju zawodnika
	select *
	from zawodnicy z
	where waga > (select AVG(waga) from zawodnicy where kraj = z.kraj)
-- 3) podaj imię i nazwisko najwyzszego zawodnika 
    select imie, nazwisko, wzrost
	from zawodnicy
	where wzrost = (select MAX(wzrost) from zawodnicy)
-- dodatkowe : 
   --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) wypisz zawodników, których wzrost jest drugi co do wielkości 
      -- odp: Michael	UHRMANN i Janne	AHONEN

	  -- najpierw znajdzmy wzrost najwiekszy 
	  -- potem znajdzmy wszystkie wzrosty mneijsze od tego wzrostu wczesniej znalezionego
	  -- i z tych wzrostow znajdzmy najwyzszy 
	  -- ostatecznie znajdz zawodnika, ktorego wzrost jest rowny temu znalezionemu wzrostowi 
	  select imie, nazwisko from zawodnicy
	  where wzrost = 
		  (select max(wzrost) from zawodnicy
		  where wzrost < 
		   (select MAX(wzrost) from zawodnicy))


--------------
-- złączenia - join --

select imie, imie_t, id_zawodnika, z.id_trenera, t.id_trenera
from zawodnicy z , trenerzy t
where  z.id_trenera = t.id_trenera
-- to jest złączenie: inner join 

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

select z.imie, z.nazwisko, z.kraj, t.imie_t, t.nazwisko_t
from zawodnicy z left join trenerzy t  on z.id_trenera=t.id_trenera
--				 left join [inna tabela] [alias] on [warunek zlaczenia]

select z.imie, s.nazwa_skoczni
from zawodnicy z right join skocznie s on left(z.kraj,1) = left(s.kraj_skoczni,1)

select * from skocznie
select * from zawody

-- str 26 
   select * from zawodnicy
   where id_trenera is null

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

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


-- http://tomaszles.pl/2018/04/19/diagram-bazy/
/* 1) dla kazdego trenera wypisz ile razy odwiedzil
   dane miasto w czasie zawodow */
select nazwa , nazwa_miasta, COUNT(*)   from
   ( select t.imie_t + ' ' + t.nazwisko_t nazwa, m.nazwa_miasta
     from trenerzy t left join zawodnicy z on z.id_trenera = t.id_trenera
                   left join uczestnictwa u on z.id_zawodnika = u.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                 ) tab
 group by nazwa, nazwa_miasta

 /*2) wypisz zawodnikow i trenerow ktorzy urodzili się w
  tym samym dniu tygodnia*/
	select z.imie , z.nazwisko, t.imie_t, t.nazwisko_t, FORMAT(z.data_ur,'dddd','pl-pl')
	from zawodnicy	z join trenerzy t on DATEPART(dw,z.data_ur) = DATEPART(dw,t.data_ur_t) 
 /* 
 3) wypisz WSZYSTKIE dni tygodnia (od pon do niedz)
    i napisz ilu zawodnikow się urodziło danego dnia*/
	 
	select d.n, COUNT( z.nazwisko)
	from	 
		 (select FORMAT(DATEFROMPARTS(2000,1, id_zawodnika+2),'dddd') n,id_zawodnika 
		 from zawodnicy where id_zawodnika < 8) d
	   left join zawodnicy z on d.n = FORMAT(z.data_ur,'dddd')	  
     group by d.n,d.id_zawodnika order by d.id_zawodnika

  /*4) 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(z1.id_zawodnika,'00') + ' x '+ format(z2.id_zawodnika,'00') + ' = ' + 
     format(z1.id_zawodnika* z2.id_zawodnika ,'00')
   from zawodnicy z1, zawodnicy z2
   where z1.id_zawodnika < 11 and z2.id_zawodnika < 11
 /*5) wypisz ternerów i zawodników którzy mają taką samą
   długość imienia */
   select z.imie, t.imie_t
   from zawodnicy z join trenerzy t  on len(z.imie) = len(t.imie_t
/* 6) 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(z.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
				  left join zawodnicy z on z.id_zawodnika= u.id_zawodnika
   group by s.nazwa_skoczni
   having COUNT(z.id_zawodnika)>2
 /*7) dla kazdego miasta wypisz kiedy odbyły się pierwsze 
 zawody , jeżeli nie odbyły się nigdy napisz: brak danych
*/ go

select nazwa_miasta, iif(suma is null,'bd',format(suma,'dd/MM/yyyy')) from
  (select m.nazwa_miasta, MIN( z.data) suma
  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) tt 

  /*
  select 
  from join 
  where
  group by 
  order by */