This project contains an in-depth SQL-based analysis of the Data Analyst job market in the UK, with a focus on the most in-demand and highest-paying skills. The goal was to identify key trends, optimal skills to learn, and salary insights for professionals looking to break into or advance within the field.
The demand for Data Analysts continues to grow, driven by the need for data-driven decision-making across industries. However, not all skills are valued equally in the job market. This project aimed to answer:
The project is structured as follows:
project_sql
sql_edit
sql_load
| Skill | Job Postings Requiring It |
|---|---|
| SQL | 29 |
| Excel | 20 |
| Python | 19 |
| Tableau | 10 |
| R | 8 |
SQL is the most critical skill, followed by Excel and Python, reinforcing the importance of data querying, manipulation, and visualization.
| Skill | Average Salary (£) |
|---|---|
| C++ | 177,283 |
| Pandas | 177,283 |
| PyTorch | 177,283 |
| NumPy | 177,283 |
| TensorFlow | 177,283 |
| MongoDB | 165,000 |
| AWS | 131,438 |
| SQL Server | 120,379 |
| Airflow | 118,140 |
| JavaScript | 111,175 |
1_top_paying_jobs.sql
/*
- Identify the top 10 highest-paying Data Analyst roles in the UK.
- Remove nulls
*/
SELECT
job_id,
job_title,
job_location,
job_schedule_type,
salary_year_avg,
job_posted_date,
company_dim.name AS company_name
FROM
job_postings_fact
LEFT JOIN company_dim ON job_postings_fact.company_id = company_dim.company_id
WHERE
job_title_short LIKE '%Data Analyst%' AND
job_location LIKE '%UK%' AND
salary_year_avg IS NOT NULL
ORDER BY
salary_year_avg DESC
LIMIT
10;
2_job_skills_required.sql
/* What are the skills required for these roles? */
WITH job_paying_jobs AS (
SELECT
job_id,
job_title,
job_location,
job_schedule_type,
salary_year_avg,
job_posted_date,
company_dim.name AS company_name
FROM
job_postings_fact
LEFT JOIN company_dim ON job_postings_fact.company_id = company_dim.company_id
WHERE
job_title_short LIKE '%Data Analyst%' AND
job_location LIKE '%UK%' AND
salary_year_avg IS NOT NULL
ORDER BY
salary_year_avg DESC
LIMIT
10
)
SELECT
job_paying_jobs.*,
skills_dim.skills AS skill_required
FROM job_paying_jobs
INNER JOIN skills_job_dim ON job_paying_jobs.job_id = skills_job_dim.job_id
INNER JOIN skills_dim ON skills_job_dim.skill_id = skills_dim.skill_id
ORDER BY
salary_year_avg DESC;
3_top_demanded_skills.sql
/*
- What are the most in-demand skills?
*/
SELECT
skills_dim.skills AS skill_name,
COUNT(job_postings_fact.job_id) AS job_count
FROM job_postings_fact
INNER JOIN skills_job_dim ON job_postings_fact.job_id = skills_job_dim.job_id
INNER JOIN skills_dim ON skills_job_dim.skill_id = skills_dim.skill_id
WHERE
job_title_short LIKE '%Data Analyst%' AND
job_location LIKE '%UK%' AND
salary_year_avg IS NOT NULL
GROUP BY
skills_dim.skill_id, skill_name
ORDER BY
job_count DESC
LIMIT 5;
4_top_paying_skills.sql
/*
What are the top skills based on salary?
*/
SELECT
skills_dim.skills AS skill_name,
ROUND(AVG(job_postings_fact.salary_year_avg), 0) AS average_salary
FROM job_postings_fact
INNER JOIN skills_job_dim ON job_postings_fact.job_id = skills_job_dim.job_id
INNER JOIN skills_dim ON skills_job_dim.skill_id = skills_dim.skill_id
WHERE
job_title_short LIKE '%Data Analyst%'
AND job_location LIKE '%UK%'
AND salary_year_avg IS NOT NULL
GROUP BY
skills_dim.skill_id, skill_name
ORDER BY
average_salary DESC
LIMIT 25;
5_optimal_skills.sql
/*
What are the most optimal skills to learn?
*/
-- combine both CTEs inside a single WITH statement, separating them with a comma
WITH skills_demand AS (
SELECT
skills_job_dim.skill_id,
skills_dim.skills AS skill_name,
COUNT(job_postings_fact.job_id) AS job_count
FROM job_postings_fact
INNER JOIN skills_job_dim ON job_postings_fact.job_id = skills_job_dim.job_id
INNER JOIN skills_dim ON skills_job_dim.skill_id = skills_dim.skill_id
WHERE
job_title_short LIKE '%Data Analyst%'
AND job_location LIKE '%UK%'
AND salary_year_avg IS NOT NULL
GROUP BY
skills_job_dim.skill_id, skill_name
),
average_salaries AS (
SELECT
skills_job_dim.skill_id,
skills_dim.skills AS skill_name,
ROUND(AVG(job_postings_fact.salary_year_avg), 0) AS average_salary
FROM job_postings_fact
INNER JOIN skills_job_dim ON job_postings_fact.job_id = skills_job_dim.job_id
INNER JOIN skills_dim ON skills_job_dim.skill_id = skills_dim.skill_id
WHERE
job_title_short LIKE '%Data Analyst%'
AND job_location LIKE '%UK%'
AND salary_year_avg IS NOT NULL
GROUP BY
skills_job_dim.skill_id, skill_name
)
SELECT
skills_demand.skill_id,
skills_demand.skill_name,
job_count,
average_salary
FROM
skills_demand
INNER JOIN
average_salaries
ON
skills_demand.skill_id = average_salaries.skill_id
WHERE
job_count > 5
ORDER BY
average_salary DESC,
job_count DESC;
3_cases.sql
SELECT *
FROM skills_job_dim
LIMIT 10;
SELECT *
FROM job_postings_fact
LIMIT 10;
SELECT *
FROM skills_dim
LIMIT 10;
SELECT
COUNT(skills_job_dim.job_id) AS count_of_posts,
skills_job_dim.skill_id,
skills_dim.skills AS skill_name
FROM skills_job_dim
INNER JOIN job_postings_fact ON job_postings_fact.job_id = skills_job_dim.job_id
INNER JOIN skills_dim ON skills_dim.skill_id = skills_job_dim.skill_id
WHERE job_postings_fact.job_location = 'Anywhere'
GROUP BY skills_job_dim.skill_id, skills_dim.skills
ORDER BY count_of_posts DESC
LIMIT 5;
SELECT job_title_short, salary_year_avg
FROM job_postings_fact
WHERE EXTRACT(MONTH FROM job_posted_date) IN (1, 2, 3)
AND salary_year_avg > 70000
AND job_title_short = 'Data Analyst'
ORDER BY salary_year_avg DESC
LIMIT 10;