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
🔢 Basic Aggregation Functions
1. COUNT()
SELECT COUNT ( * ) AS total_employees FROM employees;
SELECT COUNT ( * ) AS it_employees FROM employees WHERE dept = ' IT ' ;
2. SUM()
SELECT SUM (salary) AS total_salary FROM employees;
SELECT SUM (salary) AS hr_total_salary FROM employees WHERE dept = ' HR ' ;
3. MIN()
SELECT MIN (salary) AS lowest_salary FROM employees;
SELECT MIN (hire_date) AS first_hired FROM employees;
4. MAX()
SELECT MAX (salary) AS highest_salary FROM employees;
SELECT MAX (hire_date) AS latest_hired FROM employees;
5. AVG()
SELECT AVG (salary) AS avg_salary FROM employees;
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
dept total_employees IT 4 HR 2 Finance 2 Marketing 2
SELECT dept, AVG (salary) AS avg_salary
dept avg_salary IT 51500.00 HR 46000.00 Finance 60500.00 Marketing 51000.00
🎯 HAVING Clause
SELECT dept, AVG (salary) AS avg_salary
HAVING AVG (salary) > 50000 ;
dept avg_salary IT 51500.00 Finance 60500.00 Marketing 51000.00
🔥 Advanced Aggregation Functions
SELECT dept, STRING_AGG (fname, ' , ' ) AS employees
dept employees IT Raj, Arjun, Neha, Rahul HR Priya, Kavita Finance Suman, Anjali Marketing Amit, Vijay
SELECT dept, ARRAY_AGG(email) AS emails
SELECT PERCENTILE_CONT ( 0 . 5 ) WITHIN GROUP ( ORDER BY salary) AS median_salary
SELECT MODE() WITHIN GROUP ( ORDER BY dept) AS common_dept
SELECT PERCENTILE_CONT ( 0 . 9 ) WITHIN GROUP ( ORDER BY salary) AS p90_salary
WHERE salary = ( SELECT MAX (salary) FROM employees);
📝 Final Cheat-Sheet (Quick Reference)
Function Purpose Example Query COUNT() Counts rows SELECT COUNT(*) FROM employees;SUM() Adds values SELECT SUM(salary) FROM employees;MIN() Smallest value SELECT MIN(salary) FROM employees;MAX() Largest value SELECT MAX(salary) FROM employees;AVG() Average value SELECT AVG(salary) FROM employees;GROUP BY Group rows by column SELECT dept, COUNT(*) FROM employees GROUP BY dept;HAVING Filter groups (after aggregation) ... HAVING AVG(salary) > 50000;STRING_AGG() Join strings together SELECT dept, STRING_AGG(fname, ', ') FROM employees GROUP BY dept;ARRAY_AGG() Collect values into an array SELECT dept, ARRAY_AGG(email) FROM employees GROUP BY dept;PERCENTILE_CONT() Find median/percentiles SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) FROM employees;MODE() Most frequent value SELECT 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