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

select imie, nazwisko,'zaw' from zawodnicy
 union
select imie_t, nazwisko_t, 'tren' from trenerzy

select imie, nazwisko 
from zawodnicy where wzrost > 170
except
select imie, nazwisko 
from zawodnicy where waga < 65

-- str 29 
--cw 54,55

select imie, nazwisko, kraj from zawodnicy
union
select distinct imie_t, nazwisko_t, COALESCE(z.kraj,'bd')
from trenerzy t left join zawodnicy z on t.id_trenera = z.id_trenera 
 
-- dodatkowe
/* 
1) Sprawdź ile osób (ternerów i zawodników) urodziło się w 
danym miesiącu.
Wypisz wszystkie miesiące od stycznia do grudnia

*/
select c.m,d.ile from
	(select  format(datefromparts(2000,id_zawodnika,1),'MMMM','pl-pl') m 
		from zawodnicy where id_zawodnika < 13) c
left join
	(select msc, count(imie) ile from 
		(select imie, nazwisko ,format(datefromparts(2000,miesiac,1),'MMMM','pl-pl') msc from 
			(select imie, nazwisko, MONTH(data_ur) miesiac from zawodnicy
			union 
			select imie_t, nazwisko_t, MONTH(data_ur_t) from trenerzy) a) b
	group by msc) d
on c.m=d.msc


--2) znajdz te kraje, które znajdują sie zarówno w tabeli skocznie i zawodnicy
-- i wyświetl ilu jest zawodników z danego kraju (kolumna Zaw) i ile jest skoczni
-- z danego kraju (kolumna skocznie) */
select a.kraj, a.ile zaw, b.ile skocznie from 
	(select kraj, count(*) ile
	from zawodnicy
	group by kraj) a
join
	(select kraj_skoczni, count(*) ile
	from skocznie
	group by kraj_skoczni) b
on a.kraj=b.kraj_skoczni
/*3) 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 imie, nazwisko, wzrost, 'sredni' typ from zawodnicy
except
	(
		select imie, nazwisko, wzrost, 'sredni' typ from zawodnicy
		where wzrost < 
			(select min(wzrost) from zawodnicy) +
			(select (MAX(wzrost) - min(wzrost))/3 from zawodnicy)
		union

		select imie, nazwisko, wzrost, 'sredni' typ from zawodnicy
		where wzrost >
			 (select max(wzrost) from zawodnicy) -
			 (select (MAX(wzrost) - min(wzrost))/3 from zawodnicy)
	)
union
select imie, nazwisko, wzrost, 'niscy' typ from zawodnicy
		where wzrost < 
			(select min(wzrost) from zawodnicy) +
			(select (MAX(wzrost) - min(wzrost))/3 from zawodnicy)
union
		select imie, nazwisko, wzrost, 'wysocy' typ from zawodnicy
		where wzrost >
			 (select max(wzrost) from zawodnicy) -
			 (select (MAX(wzrost) - min(wzrost))/3 from zawodnicy)


(SELECT {distinct}  FUNKCJE | IIF | CASE WHEN END |
FROM {{left} | {right} | join}
WHERE
GROUP BY 
HAVING
ORDER BY

UNION {ALL} | INTERSECT | EXCEPT ) B



-- DLA KAZDEGO KRAJU WYPISZ SUMĘ WAGI 
select  kraj,wartosc from
	(SELECT kraj , sum(waga) wartosc,1 typ
	from zawodnicy
	group by kraj
	union
	select 'suma', sum(waga),2 typ from zawodnicy) a
order by typ

select isnull(kraj,'bd') ,sum(waga)
from zawodnicy
group by rollup (kraj)
select * from zawodnicy

select COALESCE(id_trenera,wzrost,waga,'x') from zawodnicy


select TOP 1 kraj_skoczni , COUNT(*)
from skocznie
GROUP BY ROLLUP (kraj_skoczni)
ORDER BY kraj_skoczni

-- wskaż najwyższego zawodnika
select * from zawodnicy where wzrost = 
	(SELECT top 1 wzrost
	from zawodnicy
	order by wzrost desc)
-- wskaż najcieższego z polaków  (str 11 , cw 21 i 22)
 select * from zawodnicy where kraj = 'pol' and waga = 
	 (SELECT top 1 waga
		from zawodnicy where kraj = 'pol'
		order by waga desc)

select imie, nazwisko ,id_zawodnika 
from zawodnicy
order by id_zawodnika
offset 3 rows fetch next 6 rows only


-- dla kazdego zawodnika wypisz kraj, wagę i połowę roku w której się urodził
 -- (pierwsza lub druga)
 select kraj, polowa, sum(waga)
 from 
	(select kraj, waga , iif(month(data_ur)>6,'druga','pierwsza') polowa 
	from zawodnicy) t
group by cube(kraj, polowa)


-- dla kazego zawodnika wypisz wagę, kraj, połowę roku 

select * from
	(select kraj, waga , iif(month(data_ur)>6,'druga','pierwsza') polowa 
	from zawodnicy) t
pivot 
    (
      sum(waga)
	  for polowa in ([pierwsza],[druga])
	) p

-- dla każdego miesiaca wypisz ile osób urodziło się
-- w danym miesiącu (kategoria wierszowa). 
-- kategoria wierszowa to informacja czy jest to trener czy zawodnik np:

miesiac | zawodnicy | trenerzy 
styczen     2          3
luty        4          5
marzec      2          5

select * from 
	(select imie+ nazwisko nazwa, format(data_ur,'MMMMM') miesiac, 'zawodnicy' typ
	from zawodnicy
	union
	select imie_t+ nazwisko_T, format(data_ur_T,'MMMMM'), 'trenerzy'
	from trenerzy) t 
pivot (
   count(nazwa)
   for typ in ([zawodnicy],[trenerzy])
) p


-- dla kazdego trenera wypisac imiona jego podopiecznych 

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


SELECT imie_t,
	(select REPLACE(imie+',','<imie>','') from zawodnicy
	where id_trenera = t.id_trenera for xml path(''))
from trenerzy t

/* dla kazdego zawodnika wypisz w jednej komórce wszystkie nazwy zawodów
w jakich startował */
 
 select imie + ' ' + nazwisko, 
  (
    select replace(b,'<b>','') from
	  (select  
		(select imie + ' ' + nazwisko from zawodnicy where id_zawodnika = u.id_zawodnika) a,
		(select nazwa from zawody where id_zawodow = u.id_zawodow)+',' b
	 from uczestnictwa u) t where a = z.imie + ' ' + z.nazwisko for xml path('')
 ) 
 from zawodnicy z



 select * from zawodnicy
 select * from zawody


 -- funkcje okienkowe 

 select imie, nazwisko, wzrost , lead(nazwisko,2) over (order by wzrost)
 from zawodnicy
 order by  wzrost 

 -- 1) wypisz wszystkich zawodników, któych wwzrost jest 4-ty co do wielkości
 select * from 
	 (select wzrost , rank() over (order by wzrost) r, imie, nazwisko
	 from zawodnicy) t 
where r=4
 -- 2) dla każego zawodnika wypisz o ile jest on wyższy od 
  -- zawodnika poprzedniego (względem wzrostu)

  select imie, nazwisko , wzrost - lag(wzrost,1) over (order by wzrost)
  from zawodnicy

  select imie, nazwisko, wzrost kraj, rank() over (partition by kraj order by wzrost )
  from zawodnicy

    select imie, nazwisko, wzrost ,kraj, max(wzrost) over (partition by kraj  )
  from zawodnicy



  CREATE PROC SearchAllTables
(
@SearchStr nvarchar(100)
)
AS
BEGIN

CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)

WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)

IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END

SELECT ColumnName, ColumnValue FROM #Results
END



EXEC SearchAllTables 'war'
 

 SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.zawodnicy') 


 select * from zawodnicy where kraj =  'pol'

 select top 4 * from zawodnicy

 select *
from INFORMATION_SCHEMA.COLUMNS