FAQ: Set Operations - Union All

This community-built FAQ covers the “Union All” exercise from the lesson “Set Operations”.

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

SQL: Table Transformation

FAQs on the exercise Union All

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!

I understand that the query is counting the number of order items in the union of the two tables, but I’m struggling to get what the “as a” means at the end:

SELECT count(*) FROM (
SELECT id, sale_price FROM order_items
UNION ALL
SELECT id, sale_price FROM order_items_historic) as a;

I saw something similar in earlier lessons, but couldn’t find an explanation there either.

Any help would be appreciated!

Thanks

The ‘as a’ is an SQL alias or ‘nickname’ of sorts that’s used to give a table, a column, or a subquery a temporary name that will be used in the query. The name allows for one to easily understand and define which table or subquery is being referenced by each column. It can also be used to give a column a name different from the one provided in the table so that the results reflect that alias, which is sometimes useful when the orginal column name in a table isn’t clear or readable.

1 Like

It didn’t like my answer even though it is correct.
I just don’t do the copy/paste/tweak routine to arrive at the solution.
I didn’t use the alias ‘a’ and my columns were in different order but the output is the same…very disappointing.
I wasted 5 frustrating minutes trying to figure out what was wrong with my query.

2 Likes

I found the question confusing. It sounded to me like they wanted the average sale price over the two tables, but what they actually want is the average sell price per item in the two tables.

14 Likes

I agree, this was annoying.

2 Likes

My solution gave an error, (red x stared at me like i did everything wrong), but when i checked the solution from codecademy, i couldn’t find any differences?

My solution:
select avg(a.sale_price)
, a.id
from (
select sale_price
, id
from order_items
union all
select sale_price
, id
from order_items_historic
) as a
group by 2

Codecamedy solution:

SELECT id,
avg(a.sale_price)
FROM (
SELECT id,
sale_price
FROM order_items
UNION ALL
SELECT id
, sale_price
FROM order_items_historic) AS a
GROUP BY 1;

What did i do wrong?

Grtz!

You selected a.id and it should be just id. I am not sure about the Group by function though.

My solution:
select avg(a.sale_price)
, a.id --> there it is indeed!

Thanks :slight_smile:

i think you forget putting semi- colon at end of the code
try to put it

No, we must use group by function because we using an aggregate function AVG(a.sale_price)

Completely unclear instruction about necessarity of ID column usage in outer query and inintial conditions tells nothing about clause group by. It’s frustrated me a lot.

2 Likes

Hi, I don’t quite understand the use of the items inside red rectangles in the picture below. Could someone please explain? Thank you very much.
59

1 Like

I know this thread started a while ago, but I tried a combination of things from this thread, because I initially had the same idea, except missing some subtleties like the ‘GROUP BY 1’. However I got it, in case people of the future want something else.
SELECT id, AVG(sale_price) FROM (
SELECT id, sale_price FROM order_items
UNION ALL
SELECT id, sale_price FROM order_items_historic) as a
GROUP BY 1;

1 Like

You are right. I cannot understand what is the meaning of finding the avg price per product (id).
I added another parameter to the query ,in the first line, the sale_price , in order to make things more clear to to me.
However, the result was again confusing, sale_price and avg(a.sale_price) are equal for every row i.e. for every id. So, this shows again that average price per id doesn’t make sense.

1 Like

I suppose that maybe it would be more logical if we used in the exercise the parameter order_id instead of id. As long as every single order may have either one or more than one products (id), in that case the concept of average sale price would make sense.

The term “subquery” is not defined before the question is asked:

“Using the same pattern, utilize a subquery to find the average sale price over both order_items and order_items_historic tables.”

life saver - I was trying to figure out why my query wasn’t working and it was because I didn’t realize they wanted it PER ITEM.

Appreciate your response!

I’m wondering why the alias was needed. I copied the solution and removed the alias and got the same results. If someone could enlighten me, it would be appreciated.

What is the purpose of averaging in this exercise? Between the two tables we’re unioning, no two id’s are the same. I ran the following query to show this:
SELECT id, COUNT(id)
FROM (
SELECT id, sale_price FROM order_items
UNION ALL
SELECT id, sale_price FROM order_items_historic
) AS a
GROUP BY id;
–WHERE COUNT(id) > 1; – if this line is included no output is given
The output for the COUNT(id) column was always 1.

Also, I just did SELECT id, sale_price – (instead of AVG(a.sale_price) for the first line in the solution) and diffed the outputs with a complete match. I understand what the union all does and the purpose of sub-querying, it would just be a better example in my opinion if there was actually an intuitive reason as to why we’re averaging. (For example, the UNION ALL should have some overlap with id’s, i.e. the order_items_historic table should have some id’s that are the same as order_items).