| | 1 | = Each store's average pay |
| | 2 | {{{#!sql |
| | 3 | CREATE OR REPLACE FUNCTION get_stores_average_pay() |
| | 4 | RETURNS TABLE ( |
| | 5 | store_id INT, |
| | 6 | store_name TEXT, |
| | 7 | average_pay NUMERIC |
| | 8 | ) |
| | 9 | LANGUAGE plpgsql |
| | 10 | AS $$ |
| | 11 | BEGIN |
| | 12 | RETURN QUERY |
| | 13 | SELECT |
| | 14 | s.store_id, |
| | 15 | s.name AS store_name, |
| | 16 | COALESCE(AVG(w.wage), 0) AS average_pay |
| | 17 | FROM store s |
| | 18 | LEFT JOIN worked w |
| | 19 | ON s.store_id = w.store_id |
| | 20 | GROUP BY |
| | 21 | s.store_id, |
| | 22 | s.name |
| | 23 | ORDER BY |
| | 24 | average_pay DESC; |
| | 25 | END; |
| | 26 | $$; |
| | 27 | |
| | 28 | }}} |
| | 29 | |
| | 30 | == Relational Algebra |
| | 31 | - S(store_id, name, date_of_founding, physical_address, store_email, rating) |
| | 32 | - W(id, date, store_ID, week, total_week, pay_method, wage, working_hours) |
| | 33 | |
| | 34 | **JOIN stores with employee records:** |
| | 35 | - J1 ← S ⟕S.store_id = W.store_ID W |
| | 36 | |
| | 37 | **Calculate average wage for each store:** |
| | 38 | - R ← γstore_id, name; |
| | 39 | AVG(wage) → average_pay |
| | 40 | (J1) |
| | 41 | |
| | 42 | **Sort by average wage:** |
| | 43 | - R_final ← τaverage_pay DESC(R) |
| | 44 | |
| | 45 | |