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 () 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 () below!
Agree with a comment or answer? Like () to up-vote the contribution!
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.
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.
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.
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.
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;
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.
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;
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.
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.
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).