Skip to content

PostgreSQL Aggregation Functions (Simple Guide)

Aggregation functions in PostgreSQL are used to perform calculations on multiple rows of data and return a single result. They are very useful when summarizing data like totals, averages, counts, etc.

We’ll use the following employees table for all examples 👇

🗂 Example Table: employees

emp_idfnamelnameemaildeptsalaryhire_date
1RajSharmaraj.sharma@example.comIT50000.002020-01-15
2PriyaSinghpriya.singh@example.comHR45000.002019-03-22
3ArjunVermaarjun.verma@example.comIT55000.002021-06-01
4SumanPatelsuman.patel@example.comFinance60000.002018-07-30
5KavitaRaokavita.rao@example.comHR47000.002020-11-10
6AmitGuptaamit.gupta@example.comMarketing52000.002020-09-25
7NehaDesaineha.desai@example.comIT48000.002019-05-18
8RahulKumarrahul.kumar@example.comIT53000.002021-02-14
9AnjaliMehtaanjali.mehta@example.comFinance61000.002018-12-03
10VijayNairvijay.nair@example.comMarketing50000.002020-04-19

🔢 Basic Aggregation Functions

1. COUNT()

SELECT COUNT(*) AS total_employees FROM employees;
total_employees
10
SELECT COUNT(*) AS it_employees FROM employees WHERE dept = 'IT';
it_employees
4

2. SUM()

SELECT SUM(salary) AS total_salary FROM employees;
total_salary
521000.00
SELECT SUM(salary) AS hr_total_salary FROM employees WHERE dept = 'HR';
hr_total_salary
92000.00

3. MIN()

SELECT MIN(salary) AS lowest_salary FROM employees;
lowest_salary
45000.00
SELECT MIN(hire_date) AS first_hired FROM employees;
first_hired
2018-07-30

4. MAX()

SELECT MAX(salary) AS highest_salary FROM employees;
highest_salary
61000.00
SELECT MAX(hire_date) AS latest_hired FROM employees;
latest_hired
2021-06-01

5. AVG()

SELECT AVG(salary) AS avg_salary FROM employees;
avg_salary
52100.00
SELECT AVG(salary) AS finance_avg_salary FROM employees WHERE dept = 'Finance';
finance_avg_salary
60500.00

🧩 GROUP BY with Aggregations

SELECT dept, COUNT(*) AS total_employees
FROM employees
GROUP BY dept;
depttotal_employees
IT4
HR2
Finance2
Marketing2
SELECT dept, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept;
deptavg_salary
IT51500.00
HR46000.00
Finance60500.00
Marketing51000.00

🎯 HAVING Clause

SELECT dept, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept
HAVING AVG(salary) > 50000;
deptavg_salary
IT51500.00
Finance60500.00
Marketing51000.00

🔥 Advanced Aggregation Functions

SELECT dept, STRING_AGG(fname, ', ') AS employees
FROM employees
GROUP BY dept;
deptemployees
ITRaj, Arjun, Neha, Rahul
HRPriya, Kavita
FinanceSuman, Anjali
MarketingAmit, Vijay
SELECT dept, ARRAY_AGG(email) AS emails
FROM employees
GROUP BY dept;
deptemails
IT{raj.sharma@example.com, arjun.verma@example.com, neha.desai@example.com, rahul.kumar@example.com}
HR{priya.singh@example.com, kavita.rao@example.com}
Finance{suman.patel@example.com, anjali.mehta@example.com}
Marketing{amit.gupta@example.com, vijay.nair@example.com}
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median_salary
FROM employees;
median_salary
51000.00
SELECT MODE() WITHIN GROUP (ORDER BY dept) AS common_dept
FROM employees;
common_dept
IT
SELECT PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY salary) AS p90_salary
FROM employees;
p90_salary
60000.00
SELECT *
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
emp_idfnamelnameemaildeptsalaryhire_date
9AnjaliMehtaanjali.mehta@example.comFinance61000.002018-12-03

📝 Final Cheat-Sheet (Quick Reference)

FunctionPurposeExample Query
COUNT()Counts rowsSELECT COUNT(*) FROM employees;
SUM()Adds valuesSELECT SUM(salary) FROM employees;
MIN()Smallest valueSELECT MIN(salary) FROM employees;
MAX()Largest valueSELECT MAX(salary) FROM employees;
AVG()Average valueSELECT AVG(salary) FROM employees;
GROUP BYGroup rows by columnSELECT dept, COUNT(*) FROM employees GROUP BY dept;
HAVINGFilter groups (after aggregation)... HAVING AVG(salary) > 50000;
STRING_AGG()Join strings togetherSELECT dept, STRING_AGG(fname, ', ') FROM employees GROUP BY dept;
ARRAY_AGG()Collect values into an arraySELECT dept, ARRAY_AGG(email) FROM employees GROUP BY dept;
PERCENTILE_CONT()Find median/percentilesSELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) FROM employees;
MODE()Most frequent valueSELECT MODE() WITHIN GROUP (ORDER BY dept) FROM employees;

✅ With this README + Cheat Sheet, you have:

  • Example table
  • Step-by-step queries with results
  • Advanced analytics functions
  • Quick reference for revision