Advertisement
Guest User

exam-22-10-17-tasks

a guest
Feb 19th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.93 KB | None | 0 0
  1.  
  2. /*9*/
  3. select c.name, count(e.Id) as `employees_number` from categories as c
  4. inner join departments as d on d.Id = c.Department_id
  5. inner join employees as e on d.Id = e.Department_Id
  6. group by c.name
  7. order by c.name;
  8.  
  9. /*10*/
  10. select distinct c.name from categories as c
  11. inner join reports as r on r.Category_Id = c.Id
  12. inner join users as u on r.User_Id = u.id
  13. where DAY(r.Open_Date) = day(u.birthdate) and month(r.Open_Date) = month(u.birthdate)
  14. order by c.Name;
  15.  
  16. /*11*/
  17. select concat(e.first_name, ' ', e.last_name) as `full_name`, count(r.User_Id) as `users_count` from employees as e
  18. left join reports as r on r.Employee_Id = e.id
  19. group by full_name
  20. order by users_count desc,full_name;
  21.  
  22. /*12*/
  23. select r.open_date, r.description, u.email from reports as r
  24. inner join users as u on r.User_Id = u.Id
  25. inner join categories as c on c.id = r.category_id
  26. inner join departments d on d.id = c.Department_id
  27. where r.close_date is null
  28. and char_length(r.Description) > 20
  29. and r.Description like '%str%' > 0
  30. and c.department_id in (1,4,5)
  31. order by r.Open_Date, u.email;
  32.  
  33. /*13*/
  34. SELECT DISTINCT u.Username FROM Users u
  35. JOIN Reports r on r.User_Id = u.id
  36. JOIN Categories c ON c.id = r.Category_Id
  37. WHERE (CAST(c.id as char(50)) = LEFT(u.username, 1)) OR
  38. (CAST(c.id as char(50)) = RIGHT(u.username, 1))
  39. ORDER BY u.Username;
  40.  
  41. /*14*/
  42. SELECT fn, CONCAT(cnt_closed, '/', cnt_open) FROM (
  43. SELECT
  44. CONCAT(e.first_name, ' ', e.last_name) as fn,
  45. COUNT(
  46. CASE
  47. WHEN YEAR(close_date) = 2016 THEN 'closed'
  48. WHEN YEAR(open_date) < 2016 AND YEAR(close_date) = 2016 THEN 'closed'
  49. END) cnt_closed,
  50. COUNT(
  51. CASE
  52. WHEN YEAR(open_date) = 2016 THEN 'open'
  53. END) AS cnt_open
  54. FROM reports r
  55. JOIN employees e
  56. ON r.employee_id = e.id
  57. GROUP BY fn
  58. HAVING cnt_open > 0 OR cnt_closed > 0) w
  59. order by w.fn
  60.  
  61. /*15*/
  62. SELECT d.Name AS Department_name,
  63. CASE
  64. WHEN SUM(TIMESTAMPDIFF(DAY, R.Open_date, R.Close_date)) IS NULL
  65. THEN 'no info'
  66. ELSE floor(CAST(AVG(TIMESTAMPDIFF(DAY, R.Open_date, R.Close_date)) AS char(100)))
  67. END AS `Myaverage`
  68. FROM Departments AS D
  69. JOIN Categories AS C ON C.Department_Id = D.Id
  70. LEFT JOIN Reports AS R ON R.Category_Id= C.Id
  71. GROUP BY D.Name
  72. order by d.name;
  73.  
  74. /*16*/
  75. SELECT d.Name AS Department_name,
  76. CASE
  77. WHEN SUM(TIMESTAMPDIFF(DAY, R.Open_date, R.Close_date)) IS NULL
  78. THEN 'no info'
  79. ELSE floor(CAST(AVG(TIMESTAMPDIFF(DAY, R.Open_date, R.Close_date)) AS char(100)))
  80. END AS `Myaverage`
  81. FROM Departments AS D
  82. JOIN Categories AS C ON C.Department_Id = D.Id
  83. LEFT JOIN Reports AS R ON R.Category_Id= C.Id
  84. GROUP BY D.Name
  85. order by d.name;
  86.  
  87. /*17*/
  88. CREATE FUNCTION udf_get_reports_count(employee_id INT, status_id INT)
  89. RETURNS INT
  90. BEGIN
  91. DECLARE reports_count INT;
  92. SET reports_count :=
  93. (SELECT COUNT(r.id) FROM reports AS r
  94. WHERE r.Employee_Id = employee_id
  95. and r.Status_Id = status_id);
  96. RETURN reports_count;
  97. END
  98.  
  99. /*18*/
  100. CREATE PROCEDURE usp_assign_employee_to_report(employee_id INT, report_id INT)
  101. BEGIN
  102. DECLARE employee_department_id int;
  103. DECLARE report_category_id int;
  104. DECLARE category_department_id int;
  105.  
  106. set employee_department_id := (SELECT department_id FROM employees AS e WHERE e.id = employee_id);
  107. set report_category_id := (SELECT category_id FROM reports AS r WHERE r.id = report_id);
  108. set category_department_id := (SELECT department_id FROM categories as c WHERE c.id = report_category_id);
  109.  
  110. START TRANSACTION;
  111. IF(employee_department_id != category_department_id) THEN
  112. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Employee doesn\'t belong to the appropriate department!';
  113. ROLLBACK;
  114. ELSE
  115. UPDATE reports AS r
  116. SET r.employee_id = employee_id
  117. WHERE r.id = report_id;
  118. END IF;
  119. COMMIT;
  120. END
  121.  
  122. /*19*/
  123. create trigger t_update_close_date
  124. BEFORE UPDATE ON reports
  125. FOR EACH ROW
  126. BEGIN
  127. if(old.close_date is null and new.close_date is not null) then
  128. set new.status_id = 3;
  129. end if;
  130. end
  131.  
  132. /*20*/
  133. SELECT c.name,
  134. COUNT(r.id),
  135. CASE
  136. WHEN (SELECT COUNT(*) FROM reports rr WHERE rr.status_id = (SELECT id FROM status WHERE label = 'waiting') AND rr.category_id = c.id) >
  137. (SELECT COUNT(*) FROM reports rr WHERE rr.status_id = (SELECT id FROM status WHERE label = 'in progress') AND rr.category_id = c.id)
  138. THEN 'waiting'
  139. WHEN (SELECT COUNT(*) FROM reports rr WHERE rr.status_id = (SELECT id FROM status WHERE label = 'waiting') AND rr.category_id = c.id) <
  140. (SELECT COUNT(*) FROM reports rr WHERE rr.status_id = (SELECT id FROM status WHERE label = 'in progress') AND rr.category_id = c.id)
  141. THEN 'in progress'
  142. ELSE 'equal'
  143. END as main_status
  144. FROM categories c
  145. JOIN reports r
  146. ON r.category_id = c.id
  147. JOIN status s
  148. ON r.status_id = s.id
  149. WHERE s.label IN ('waiting', 'in progress')
  150. GROUP BY c.name;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement