Bird
Raised Fist0
SQLquery~5 mins

GROUP BY single column in SQL

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
GROUP BY helps us organize data by one column so we can see summaries for each group.
When you want to count how many items belong to each category.
When you want to find the total sales for each product.
When you want to see the average score for each student.
When you want to list unique values and some calculation for each.
When you want to group data by date, like sales per day.
Syntax
SQL
SELECT column_name, AGGREGATE_FUNCTION(column_name)
FROM table_name
GROUP BY column_name;
AGGREGATE_FUNCTION can be COUNT, SUM, AVG, MAX, MIN, etc.
Every column in SELECT that is not inside an aggregate must be in GROUP BY.
Examples
Counts how many employees are in each department.
SQL
SELECT department, COUNT(*)
FROM employees
GROUP BY department;
Adds up the prices of products in each category.
SQL
SELECT category, SUM(price)
FROM products
GROUP BY category;
Finds the average age of customers in each city.
SQL
SELECT city, AVG(age)
FROM customers
GROUP BY city;
Sample Program
This creates a sales table, adds some sales data, then sums amounts for each product.
SQL
CREATE TABLE sales (
  id INT,
  product VARCHAR(20),
  amount INT
);

INSERT INTO sales VALUES
(1, 'Apple', 10),
(2, 'Banana', 5),
(3, 'Apple', 15),
(4, 'Banana', 7),
(5, 'Cherry', 20);

SELECT product, SUM(amount) AS total_amount
FROM sales
GROUP BY product;
OutputSuccess
Important Notes
Every column in SELECT that is not inside an aggregate function must be in GROUP BY.
GROUP BY groups rows that have the same value in the specified column.
You can use ORDER BY after GROUP BY to sort the grouped results.
Summary
GROUP BY groups data by one column to summarize it.
Use aggregate functions like COUNT, SUM, AVG with GROUP BY.
Every non-aggregate column in SELECT must be in GROUP BY.

Practice

(1/5)
1. What does the GROUP BY clause do in an SQL query?
easy
A. It deletes duplicate rows from the table.
B. It sorts the rows in ascending order.
C. It groups rows that have the same values in a specified column.
D. It filters rows based on a condition.

Solution

  1. Step 1: Understand the purpose of GROUP BY

    The GROUP BY clause collects rows with the same value in the specified column into groups.
  2. Step 2: Differentiate from other clauses

    Unlike ORDER BY which sorts, or WHERE which filters, GROUP BY organizes data for aggregation.
  3. Final Answer:

    It groups rows that have the same values in a specified column. -> Option C
  4. Quick Check:

    GROUP BY = grouping rows by column [OK]
Hint: GROUP BY collects rows sharing column values [OK]
Common Mistakes:
  • Confusing GROUP BY with ORDER BY
  • Thinking GROUP BY filters rows
  • Assuming GROUP BY deletes duplicates
2. Which of the following is the correct syntax to group data by the column department?
easy
A. SELECT department, COUNT(*) FROM employees GROUP BY department;
B. SELECT department, COUNT(*) FROM employees ORDER BY department;
C. SELECT department, COUNT(*) FROM employees WHERE department;
D. SELECT department, COUNT(*) FROM employees HAVING department;

Solution

  1. Step 1: Identify correct GROUP BY usage

    The GROUP BY clause must follow FROM and group by the column named.
  2. Step 2: Check each option's clause

    SELECT department, COUNT(*) FROM employees GROUP BY department; uses GROUP BY correctly; others use ORDER BY, WHERE, HAVING incorrectly here.
  3. Final Answer:

    SELECT department, COUNT(*) FROM employees GROUP BY department; -> Option A
  4. Quick Check:

    GROUP BY syntax = SELECT ... GROUP BY column [OK]
Hint: GROUP BY follows FROM and groups by column [OK]
Common Mistakes:
  • Using ORDER BY instead of GROUP BY
  • Using WHERE to group data
  • Using HAVING without aggregation
3. Given the table sales with columns region and amount, what is the output of this query?
SELECT region, SUM(amount) FROM sales GROUP BY region;
medium
A. A list of all sales amounts without grouping.
B. A list of regions with the total sales amount for each region.
C. An error because SUM() cannot be used with GROUP BY.
D. A list of regions sorted by amount.

Solution

  1. Step 1: Understand GROUP BY with SUM()

    The query groups rows by region and sums the amount for each group.
  2. Step 2: Predict output format

    The output shows each region once with the total amount of sales in that region.
  3. Final Answer:

    A list of regions with the total sales amount for each region. -> Option B
  4. Quick Check:

    GROUP BY + SUM() = grouped sums [OK]
Hint: GROUP BY + SUM() gives totals per group [OK]
Common Mistakes:
  • Thinking SUM() can't be used with GROUP BY
  • Expecting ungrouped list
  • Confusing sorting with grouping
4. Identify the error in this SQL query:
SELECT department, COUNT(*) FROM employees;
medium
A. The query is correct and will run without errors.
B. COUNT(*) cannot be used without WHERE clause.
C. department cannot be selected without aggregation.
D. Missing GROUP BY clause for the department column.

Solution

  1. Step 1: Check SELECT with aggregation

    COUNT(*) is an aggregate but department is not aggregated or grouped.
  2. Step 2: Identify missing GROUP BY

    To select department with COUNT(*), GROUP BY department is required.
  3. Final Answer:

    Missing GROUP BY clause for the department column. -> Option D
  4. Quick Check:

    Non-aggregated columns need GROUP BY [OK]
Hint: Non-aggregated columns need GROUP BY [OK]
Common Mistakes:
  • Ignoring missing GROUP BY
  • Thinking COUNT(*) needs WHERE
  • Assuming query runs without error
5. You have a table orders with columns customer_id, order_date, and total. You want to find the average order total per customer but only for customers who have placed more than 3 orders. Which query correctly achieves this?
hard
A. SELECT customer_id, AVG(total) FROM orders GROUP BY customer_id HAVING COUNT(*) > 3;
B. SELECT customer_id, AVG(total) FROM orders WHERE COUNT(*) > 3 GROUP BY customer_id;
C. SELECT customer_id, AVG(total) FROM orders GROUP BY customer_id WHERE COUNT(*) > 3;
D. SELECT customer_id, AVG(total) FROM orders HAVING COUNT(*) > 3 GROUP BY customer_id;

Solution

  1. Step 1: Use GROUP BY to group orders by customer_id

    This groups all orders per customer to calculate aggregates.
  2. Step 2: Use HAVING to filter groups with more than 3 orders

    HAVING filters groups after aggregation; WHERE cannot filter aggregates.
  3. Final Answer:

    SELECT customer_id, AVG(total) FROM orders GROUP BY customer_id HAVING COUNT(*) > 3; -> Option A
  4. Quick Check:

    HAVING filters groups, WHERE filters rows [OK]
Hint: Use HAVING to filter groups after GROUP BY [OK]
Common Mistakes:
  • Using WHERE to filter aggregated counts
  • Placing HAVING before GROUP BY
  • Not filtering groups at all