w3resource

PL/SQL program: Average salary by job title

PL/SQL While Loop: Exercise-13 with Solution

Write a PL/SQL program to display the average salary for each job. Return job title and average salary in a row.

Sample Solution:

Table: employees

employee_id		integer
first_name		varchar(25)
last_name		varchar(25)
email			archar(25)
phone_number		varchar(15)
hire_date		date
job_id			varchar(25)
salary			integer
commission_pct		decimal(5,2)
manager_id		integer
department_id		integer

PL/SQL Code:

SET SERVEROUTPUT ON;
DECLARE
v_job_titleemployees.job_title%TYPE;
v_avg_salary NUMBER;
v_total_salary NUMBER;
v_employee_count NUMBER;
    CURSOR c_job_titles IS
    SELECT DISTINCT job_title
    FROM employees;
      CURSOR c_employees (p_job_title IN employees.job_title%TYPE) IS
    SELECT salary
    FROM employees
    WHERE job_title = p_job_title;
BEGIN
  DBMS_OUTPUT.PUT_LINE('Job Title' || CHR(9) || 'Average Salary');
  DBMS_OUTPUT.PUT_LINE('-----------------------------------');
    OPEN c_job_titles;
  FETCH c_job_titles INTO v_job_title;
    WHILE c_job_titles%FOUND LOOP
v_total_salary := 0;
v_employee_count := 0;
        OPEN c_employees(v_job_title);
    FETCH c_employees INTO v_avg_salary;
        WHILE c_employees%FOUND LOOP
v_total_salary := v_total_salary + v_avg_salary;
v_employee_count := v_employee_count + 1;
      FETCH c_employees INTO v_avg_salary;
    END LOOP;
        CLOSE c_employees;
        IF v_employee_count> 0 THEN
v_avg_salary := v_total_salary / v_employee_count;
    ELSE
v_avg_salary := 0;
    END IF;
        DBMS_OUTPUT.PUT_LINE(v_job_title || CHR(9) || v_avg_salary);
        FETCH c_job_titles INTO v_job_title;
  END LOOP;
    CLOSE c_job_titles;
END;
/

Sample Output:

Job Title Average Salary
-----------------------------------
AD_VP 17000
FI_ACCOUNT 7920
PU_CLERK 2780
SH_CLERK 3215
HR_REP 6500
PU_MAN 11000
AC_MGR 12000
ST_CLERK 2785
AD_ASST 4400
IT_PROG 5760
SA_MAN 12200
AC_ACCOUNT 8300
FI_MGR 12000
ST_MAN 7280
AD_PRES 24000
MK_MAN 13000

.....

Explanation:

The said code in Oracle's PL/SQL that calculates and displays the average salary for each job title in a tabular format.

The variables v_job_title, v_avg_salary, v_total_salary, and v_employee_count are declared to store the job title, average salary, total salary, and employee count, respectively.

The two cursors c_job_titles that selects distinct job titles from the employees table and c_employees that retrieves the salaries for a specific job title are defined.

The outer WHILE loop c_job_titles%FOUND LOOP starts, which iterates through each job title and continues fetching the next job title until no more rows are found.

Within the outer loop, the v_total_salary and v_employee_count variables are reset to zero for each job title.

The c_employees cursor is passing the current job title as a parameter and it retrieves the salaries for the current job title.

The inner WHILE loop c_employees%FOUND LOOP begins, which calculates the total salary and counts the number of employees for the current job title and the v_total_salary is incremented by the v_avg_salary for each employee, and the v_employee_count is incremented by 1 and it continues fetching the next salary until no more rows are found.

The average salary for the current job title is calculated by dividing the v_total_salary by v_employee_count.

The job title and average salary are displayed using the DBMS_OUTPUT.PUT_LINE statement.

Flowchart:

Flowchart: PL/SQL While Loop Exercises - Average salary by job title.

Previous: Display Departments and Employees.
Next: Department-wise total salary expense.

What is the difficulty level of this exercise?



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://w3resource.com/plsql-exercises/while-loop/plsql-while-loop-exercise-13.php