A running total is a cumulative sum of values in a column, calculated row by row, adding each value to the sum of all previous values.
Click to reveal answer
intermediate
How can you calculate a running total without using window functions?
You can calculate a running total by using a correlated subquery that sums all rows up to the current row based on an ordering column.
Click to reveal answer
intermediate
Write a simple SQL query snippet to calculate a running total without window functions.
SELECT t1.id, t1.amount, (SELECT SUM(t2.amount) FROM table_name t2 WHERE t2.id <= t1.id) AS running_total FROM table_name t1 ORDER BY t1.id;
Click to reveal answer
intermediate
Why might using window functions be preferred over correlated subqueries for running totals?
Window functions are usually more efficient and easier to read because they avoid repeated subqueries and can process rows in a single pass.
Click to reveal answer
beginner
What is a correlated subquery in the context of running totals?
A correlated subquery is a subquery that refers to the outer query's current row, allowing it to calculate sums up to that row for the running total.
Click to reveal answer
Which SQL clause is essential to order rows when calculating a running total without window functions?
AGROUP BY
BORDER BY
CHAVING
DWHERE
✗ Incorrect
ORDER BY is used to define the sequence of rows so the running total sums values in the correct order.
What does a correlated subquery do in a running total calculation?
ACalculates the sum of all rows up to the current row
BFilters rows based on a condition
CJoins two tables
DDeletes duplicate rows
✗ Incorrect
The correlated subquery sums values from the start up to the current row to produce the running total.
Which of these is a disadvantage of using correlated subqueries for running totals?
AThey do not require ordering
BThey are always faster than window functions
CThey can be slow on large datasets
DThey cannot calculate sums
✗ Incorrect
Correlated subqueries run a subquery for each row, which can be slow on large tables.
If you cannot use window functions, what SQL feature helps to calculate running totals?
AStored procedures
BTriggers
CIndexes
DCorrelated subqueries
✗ Incorrect
Correlated subqueries allow calculating running totals by summing rows up to the current one.
In the query: SELECT t1.id, (SELECT SUM(t2.amount) FROM table t2 WHERE t2.id <= t1.id) FROM table t1, what does 't2.id <= t1.id' ensure?
AIt sums amounts from the first row up to the current row
BIt filters out all rows
CIt sums only the current row
DIt orders the rows randomly
✗ Incorrect
The condition sums all amounts from rows with id less than or equal to the current row's id, creating a running total.
Explain how to calculate a running total in SQL without using window functions.
Think about summing all previous rows for each row.
You got /3 concepts.
Describe the advantages and disadvantages of using correlated subqueries for running totals compared to window functions.
Consider performance and compatibility.
You got /3 concepts.
Practice
(1/5)
1. What is the main idea behind calculating a running total without using window functions in SQL?
easy
A. Use GROUP BY to group all rows together.
B. Use the SUM() function without any conditions.
C. Use a JOIN to combine unrelated tables.
D. Use a subquery to sum all previous rows up to the current row.
Solution
Step 1: Understand running total concept
A running total means adding values step-by-step, including all previous rows up to the current one.
Step 2: Identify method without window functions
Without window functions, a common way is to use a subquery that sums all rows with an ID less than or equal to the current row's ID.
Final Answer:
Use a subquery to sum all previous rows up to the current row. -> Option D
Quick Check:
Running total = cumulative sum using subquery [OK]
Hint: Think cumulative sum using subquery with condition [OK]
Common Mistakes:
Using SUM() without filtering rows
Trying to use GROUP BY for running total
Confusing JOIN with running total calculation
2. Which of the following SQL queries correctly calculates a running total of the amount column without using window functions, assuming id orders the rows?
easy
A. SELECT id, amount, (SELECT SUM(amount) FROM sales WHERE id <= s.id) AS running_total FROM sales s ORDER BY id;
B. SELECT id, amount, SUM(amount) OVER (ORDER BY id) AS running_total FROM sales ORDER BY id;
C. SELECT id, amount, SUM(amount) FROM sales GROUP BY id ORDER BY id;
D. SELECT id, amount, amount + LAG(amount) FROM sales ORDER BY id;
Solution
Step 1: Identify correct syntax without window functions
SELECT id, amount, (SELECT SUM(amount) FROM sales WHERE id <= s.id) AS running_total FROM sales s ORDER BY id; uses a correlated subquery summing amounts where id is less or equal to current row's id, which is correct for running total without window functions.
Step 2: Check other options for errors
SELECT id, amount, SUM(amount) OVER (ORDER BY id) AS running_total FROM sales ORDER BY id; uses window function SUM() OVER, which is not allowed here. SELECT id, amount, SUM(amount) FROM sales GROUP BY id ORDER BY id; misuses GROUP BY without running total logic. SELECT id, amount, amount + LAG(amount) FROM sales ORDER BY id; uses LAG() which is a window function.
Final Answer:
SELECT id, amount, (SELECT SUM(amount) FROM sales WHERE id <= s.id) AS running_total FROM sales s ORDER BY id; -> Option A
Quick Check:
Subquery sums previous rows correctly [OK]
Hint: Look for subquery with condition id <= current id [OK]
Common Mistakes:
Using window functions despite instructions
Misusing GROUP BY without aggregation logic
Using LAG() which is a window function
3. Given the table sales with rows: id | amount 1 | 10 2 | 20 3 | 15 What is the output of this query?
SELECT id, amount, (SELECT SUM(amount) FROM sales WHERE id <= s.id) AS running_total FROM sales s ORDER BY id;
medium
A. 1 | 10 | 10 2 | 20 | 20 3 | 15 | 15
B. 1 | 10 | 10 2 | 20 | 30 3 | 15 | 45
C. 1 | 10 | 10 2 | 20 | 25 3 | 15 | 40
D. 1 | 10 | 10 2 | 20 | 30 3 | 15 | 15
Solution
Step 1: Calculate running total for each row
For id=1: sum amounts where id <=1 is 10. For id=2: sum amounts where id <=2 is 10+20=30. For id=3: sum amounts where id <=3 is 10+20+15=45.
4. Consider this query intended to calculate a running total:
SELECT id, amount, (SELECT SUM(amount) FROM sales WHERE id < s.id) AS running_total FROM sales s ORDER BY id;
What is the main issue with this query?
medium
A. It will cause a syntax error due to missing GROUP BY.
B. It uses window functions which are not allowed.
C. It excludes the current row's amount from the running total.
D. It sums amounts from unrelated tables.
Solution
Step 1: Analyze the subquery condition
The subquery sums amounts where id is less than current row's id, so it excludes the current row's amount.
Step 2: Understand running total definition
Running total should include the current row's amount, so condition should be id <= s.id, not id < s.id.
Final Answer:
It excludes the current row's amount from the running total. -> Option C
Quick Check:
Use id <= current id to include current row [OK]
Hint: Check if current row is included in sum condition [OK]
Common Mistakes:
Using < instead of <= in subquery condition
Expecting window functions in this query
Assuming syntax error due to GROUP BY
5. You have a transactions table with columns trans_id, user_id, and amount. You want to calculate a running total of amount for each user_id ordered by trans_id, but you cannot use window functions. Which query correctly achieves this?
hard
A. SELECT t1.trans_id, t1.user_id, t1.amount, (SELECT SUM(t2.amount) FROM transactions t2 WHERE t2.user_id = t1.user_id AND t2.trans_id <= t1.trans_id) AS running_total FROM transactions t1 ORDER BY t1.user_id, t1.trans_id;
B. SELECT trans_id, user_id, amount, SUM(amount) OVER (PARTITION BY user_id ORDER BY trans_id) AS running_total FROM transactions ORDER BY user_id, trans_id;
C. SELECT trans_id, user_id, amount, SUM(amount) FROM transactions GROUP BY user_id, trans_id ORDER BY user_id, trans_id;
D. SELECT t1.trans_id, t1.user_id, t1.amount, (SELECT SUM(amount) FROM transactions WHERE trans_id <= t1.trans_id) AS running_total FROM transactions t1 ORDER BY user_id, trans_id;
Solution
Step 1: Understand requirement for per-user running total
Running total must reset for each user_id and sum amounts up to current trans_id.
Step 2: Analyze options for correct filtering
SELECT t1.trans_id, t1.user_id, t1.amount, (SELECT SUM(t2.amount) FROM transactions t2 WHERE t2.user_id = t1.user_id AND t2.trans_id <= t1.trans_id) AS running_total FROM transactions t1 ORDER BY t1.user_id, t1.trans_id; uses a correlated subquery filtering by same user_id and trans_id less or equal current, correctly calculating running total per user.
Step 3: Identify errors in other options
SELECT trans_id, user_id, amount, SUM(amount) OVER (PARTITION BY user_id ORDER BY trans_id) AS running_total FROM transactions ORDER BY user_id, trans_id; uses window functions (not allowed). SELECT trans_id, user_id, amount, SUM(amount) FROM transactions GROUP BY user_id, trans_id ORDER BY user_id, trans_id; misuses GROUP BY without running total logic. SELECT t1.trans_id, t1.user_id, t1.amount, (SELECT SUM(amount) FROM transactions WHERE trans_id <= t1.trans_id) AS running_total FROM transactions t1 ORDER BY user_id, trans_id; sums amounts ignoring user_id, mixing all users.
Final Answer:
SELECT t1.trans_id, t1.user_id, t1.amount, (SELECT SUM(t2.amount) FROM transactions t2 WHERE t2.user_id = t1.user_id AND t2.trans_id <= t1.trans_id) AS running_total FROM transactions t1 ORDER BY t1.user_id, t1.trans_id; -> Option A
Quick Check:
Subquery filters by user and trans_id for running total [OK]
Hint: Filter subquery by user_id and trans_id <= current [OK]
Common Mistakes:
Ignoring user_id in running total calculation
Using window functions despite restriction
Not ordering results properly
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.