FAQ: Conditional Aggregates - Combining aggregates II

This community-built FAQ covers the “Combining aggregates II” exercise from the lesson “Conditional Aggregates”.

Paths and Courses
This exercise can be found in the following Codecademy content:

SQL: Table Transformation

FAQs on the exercise Combining aggregates II

There are currently no frequently asked questions associated with this exercise – that’s where you come in! You can contribute to this section by offering your own questions, answers, or clarifications on this exercise. Ask or answer a question by clicking reply (reply) below.

If you’ve had an “aha” moment about the concepts, formatting, syntax, or anything else with this exercise, consider sharing those insights! Teaching others and answering their questions is one of the best ways to learn and stay sharp.

Join the Discussion. Help a fellow learner on their journey.

Ask or answer a question about this exercise by clicking reply (reply) below!

Agree with a comment or answer? Like (like) to up-vote the contribution!

Need broader help or resources? Head here.

Looking for motivation to keep learning? Join our wider discussions.

Learn more about how to use this guide.

Found a bug? Report it!

Have a question about your account or billing? Reach out to our customer support team!

None of the above? Find out where to ask other questions here!

Why does adding a couple of extra brackets here make a difference to how to query runs? Does SQL not follow BODMAS?

SELECT state,
100.0*
(
SUM(CASE WHEN elevation >= 2000
THEN 1 ELSE 0
END)/COUNT(*)
)
AS percentage_high_elevation_airports
FROM airports
GROUP BY state

;

2 Likes

What is the 'Then 1" mean in the case when logic?

SELECT state, 100.0 * sum(CASE WHEN elevation >= 2000 THEN 1 ELSE 0 END) /
count(*) as percentage_high_elevation_airports
FROM airports
GROUP BY state;

1 Like

What we want to calculate is the ratio of airports with the elevation above 2000 to all the airports in each state. So once there is an airport with the elevation above 2000, we mark it as “1”, and the sum of “1” is the No. of airports with the elevation above 2000. COUNT(*) can help us calculate the No. of all airport in each state, so after dividing these two numbers, we can get the percentage we want.

3 Likes

I had a similar problem as the OP, aidlo.

If I put all the conditional aggregate in parenthesis next to the multiplier like so:

100.0* ( SUM(CASE …) / COUNT(*) )

…it doesn’t calculate correctly.

However, if I put parenthesis around the multiplier and the first aggregate like so:

( 100.0 * sum(CASE…) ) / count(*)

…then this works correctly.

This doesn’t make sense to me. The math should be the same, but the results are completely different. Is this a Codecademy issue or a formatting thing with SQL as a whole?

Or have I completely forgotten the order of mathematical operations? I feel confident that the first example should work because I’m dividing the two numbers to get a decimal and then multiplying everything by 100 to convert it to percentage.

1 Like

This is a bs exercise… Indeed, no matters what you have typed, if you didn’t remove the unnecessary paranthesses, no result would come…

The issue here is as so:
if we run this:
SELECT 100.03/7, 100.0(3/7);
we can see that with no brackets we get 42.85, and with brackets, we get 0.
This happens when dividing integer values with some programming languages (and probably why they use 100.0 here and not 100).
The difference is in the calculation of 3/7, which includes only integer values, and returns just the 0 (when it should be 0.42) and the remainder is disregarded.
That’s why we are getting zeros where there should be other values (for AK for example).

Can someone help me on why the following does not work?

SELECT state, (100.0 * count(CASE WHEN elevation >= 2000 THEN 1 ELSE IS NULL END) / count(*)) as percentage_high_elevation_airports FROM airports GROUP BY state;

Thank you!

Your format looked right to me, so I was a bit stumped by this at first, but I did some experimentation. it looks like you want “ELSE NULL” not “ELSE IS NULL.” You’re also missing a parenthesis before “COUNT” compared to the “right” answer I found (using the SUM function instead) for this problem, but it seems to run fine even without that parenthesis. So I think the issue just was using “IS NULL” instead of just “NULL.”

Why doesn’t the below code work? I used COUNT instead of SUM as it was shown in the previous example to count 1’s.

SELECT state,100.0*(
COUNT(case when elevation>=2000 then 1 else 0)/
COUNT(*)) as percentage_high_elevation_airports from airports
group by state;

1 Like

So why do we use (100(SUM(CASE)/COUNT(*) AS*

instead of

(100(SUM(CASE)/SUM(ELEVATION) AS*

1 Like