#Ile pracowników pracowało kiedykolwiek w firmie?
SELECT COUNT(emp_no) FROM employees;

#Ile pracowników zostało zatrudnionych po roku 1989?
SELECT COUNT(emp_no) as nmb FROM employees
WHERE employees.hire_date>=MAKEDATE(1990,1);

#Ile pracowników ma nazwisko kończące się na 'a'?
SELECT COUNT(emp_no) as nmb FROM employees
WHERE employees.last_name LIKE '%a';

#Ile pracowników ma imię zawierające 'anna'?
SELECT COUNT(emp_no) as nmb FROM employees
WHERE employees.first_name LIKE '%anna%';

#Ile pracowników jest kobietami i ma imię zawierające 'anna'?
SELECT COUNT(emp_no) as nmb FROM employees
WHERE employees.first_name LIKE '%anna%' AND
  employees.gender='F';

#Ile różnych stanowisk jest w firmie?
SELECT COUNT(DISTINCT title) as nmb from titles;

#Wypisz nazwy wszystkich stanowisk w firmie posortowane rosnąco
SELECT DISTINCT title from titles
ORDER BY title;

#Ile pracowników jest obecnie zatrudnionych?
SELECT COUNT(DISTINCT emp_no) as nmb FROM titles
  WHERE to_date=MAKEDATE(9999,1);

#Ile pracowników jest obecnie zatrudnionych na poszczególnych stanowiskach?
SELECT title, COUNT(emp_no) as nmb FROM titles
  WHERE to_date=MAKEDATE(9999,1)
GROUP BY title;

#Znaleźć średnią oraz odchylenie standardowe obecnie wypłacanych pensji.
SELECT AVG(salary) as avgSalary, STD(salary) as stdSalary FROM salaries
WHERE to_date=MAKEDATE(9999,1);

#Znaleźć najwyższą i najniższą z obecnie wypłacanych pensji, oraz różnicę między nimi
SELECT MAX(salary) as max, MIN(salary) as min, MAX(salary)-MIN(salary) as spread FROM salaries
WHERE to_date=MAKEDATE(9999,1);

#ilu pracowników było zatrudnianych w kolejnych latach?
SELECT YEAR(hire_date) as year, COUNT(emp_no) as nmb FROM employees
GROUP BY YEAR(hire_date);

#ile pracowników to mężczyźni a ile kobiety?
SELECT gender, COUNT(emp_no) as nmb FROM employees
GROUP BY gender;

#ile różnych departamentów jest w firmie?
SELECT COUNT(DISTINCT dept_name) as nmb FROM departments;

#Znajdź rozkład wieku wszystkich pracowników (załóż, że mamy obecnie rok 2000)
SELECT 2000-YEAR(birth_date) as age, COUNT(emp_no) as nmb FROM employees
GROUP BY YEAR(birth_date);

#Znajdź liczbę wszystkich pracowników w podziale na pierwszą literę nazwiska
SELECT SUBSTR(last_name,1,1) as firstLetter, COUNT(emp_no) as nmb FROM employees
GROUP BY SUBSTR(last_name,1,1);

#znajdź liczbę pracowników urodzonych w kwietniu, czerwcu i sierpniu
SELECT MONTH(birth_date) AS birth, COUNT(emp_no) as nmb FROM employees
GROUP BY MONTH(birth_date)
HAVING birth IN (4, 6, 8);

#ilu pracowników mają poszczególne departamenty?
SELECT dept_no, COUNT(emp_no) as nmb FROM dept_emp
WHERE to_date=MAKEDATE(9999,1)
GROUP BY dept_no;

#ilu managerów miały, łącznie w swojej historii, poszególne departamenty?
SELECT dept_no, COUNT(emp_no) as nmb FROM dept_manager
GROUP BY dept_no;

#jacy managerowie (emp_no) zarządzają obecnie poszególnymi departamentami?
SELECT dept_no, emp_no FROM dept_manager
  WHERE to_date=MAKEDATE(9999,1);

#jacy managerowie (imię i nazwisko) zarządzają obecnie poszególnymi departamentami (nazwa)?
SELECT dept_name, first_name, last_name  FROM dept_manager JOIN employees ON dept_manager.emp_no = employees.emp_no
  JOIN departments ON dept_manager.dept_no = departments.dept_no
  WHERE to_date=MAKEDATE(9999,1);

#ilu pracowników mają obecnie poszczególne departamenty (nazwa)?
SELECT dept_name, COUNT(emp_no) as nmb FROM dept_emp JOIN departments ON dept_emp.dept_no = departments.dept_no
  WHERE to_date=MAKEDATE(9999,1)
GROUP BY dept_name;

#Ile pracowników, którzy nadal pracują, zostało zatrudnionych po roku 1989?
SELECT COUNT(employees.emp_no) as nmb FROM employees JOIN titles ON employees.emp_no = titles.emp_no
WHERE employees.hire_date>=MAKEDATE(1990,1) AND
titles.to_date=MAKEDATE(9999,1);

#Znaleźć średnią oraz odchylenie standardowe obecnie wypłacanych pensji w podziale na staż pracy (liczony do 2000)
SELECT 2000-YEAR(employees.hire_date) as age , AVG(salary) as avgSalary, STD(salary)
FROM salaries JOIN employees ON salaries.emp_no = employees.emp_no
WHERE to_date=MAKEDATE(9999,1)
GROUP BY YEAR(employees.hire_date);

#Znaleźć średnią oraz odchylenie standardowe obecnie wypłacanych pensji w podziale na stanowiska pracy
SELECT title, AVG(salary) as avgSalary, STD(salary)
FROM salaries JOIN titles ON salaries.emp_no=titles.emp_no
WHERE salaries.to_date=MAKEDATE(9999,1)
GROUP BY title;

#Znajdź najwyższą i najniższą z obecnie wypłacanych pensji, oraz różnicę między nimi w podziale na stanowiska pracy
SELECT title, MAX(salary) as max , MIN(salary) as min, MAX(salary)-MIN(salary) as spread
FROM salaries JOIN titles ON salaries.emp_no=titles.emp_no
WHERE salaries.to_date=MAKEDATE(9999,1)
GROUP BY title;

#Znajdź najwyższą i najniższą z obecnie wypłacanych pensji, oraz różnicę między nimi w podziale na staż pracy (liczony do 2000)
SELECT 2000-YEAR(employees.hire_date), MAX(salary) as max, MIN(salary) as min, MAX(salary)-MIN(salary) as spread
FROM salaries JOIN employees ON salaries.emp_no = employees.emp_no
WHERE to_date=MAKEDATE(9999,1)
GROUP BY YEAR(employees.hire_date);

#ilu pracowników, obecnie otrzymujących wynagrodzenie, zarabia więcej niż średnie wynagrodzenia
SELECT count(DISTINCT emp_no) as nmb FROM salaries
WHERE to_date>"2016_01_01" AND
      salary>(SELECT AVG(salary) FROM salaries WHERE to_date>"2016_01_01");
      
#jakie jest przeciętne wynagrodzenie pracowników, którzy obecnie zarabiają więcej niż jeden sigma powyżej średniego wynagrodzenia
SELECT avg(salary) as avgSalary FROM salaries
WHERE to_date>"2016_01_01" AND
      salary>(SELECT AVG(salary)+STD(salary) FROM salaries WHERE to_date>"2016_01_01");
      
#ilu pracowników zarabia poniżej 3 sigma od średniego wynagrodzenia
SELECT count(DISTINCT salary) as nmb FROM salaries
WHERE to_date>"2016_01_01" AND
      salary<(SELECT AVG(salary)-3*STD(salary) FROM salaries WHERE to_date>"2016_01_01");
      
#ilu pracowników zarabia powyżej 3 sigma od średniego wynagrodzenia
SELECT count(emp_no) as nmb FROM salaries
WHERE to_date>"2016_01_01" AND
      salary>(SELECT AVG(salary)+3*STD(salary) FROM salaries WHERE to_date>"2016_01_01");

#znajdź nazwiska wszystkich obecnie pracujących managerów (użyj podzapytania a nie join)
SELECT employees.last_name FROM employees WHERE
  emp_no IN (SELECT emp_no FROM dept_manager WHERE to_date>"2016_01_01");

#znajdz odchylenie standardowe dla zbioru średnich obecnych wynagrodzeń liczonych dla poszczególnych stanowisk
SELECT STD(avg_salary) avgSalarySTD FROM
  (SELECT avg(salary) as avg_salary, title FROM salaries INNER JOIN titles ON salaries.emp_no=titles.emp_no
   WHERE salaries.to_date>"2016_01_01" AND titles.to_date>"2016_01_01"
    GROUP BY titles.title) AS avgSalaries;

#znajdź 95 kwantyl wynagrodzeń (wszystkich, czyli 95 kwantyle kolumny salary)
SELECT salary FROM
  (SELECT @rownum:=@rownum+1 as `row_number`, salary FROM salaries, (SELECT @rownum:=0) r
ORDER BY salary) t1
WHERE row_number>(SELECT floor(count(*)*95/100) from salaries)
LIMIT 1;

