#sql #oracle
#sql #Oracle
Вопрос:
select home2012.region_name, avg(home2012.per_price), avg(home2019.per_price) from home2012 left join (select region_name, avg(per_price) from home2019 group by region_name) on home2012.region_name = home2019.region_name group by region_name;
Я хочу сгруппировать по имени региона каждую таблицу(home2012, home2019), а затем присоединиться к ним по тому же имени региона(после группы по). Но при этом возникает ошибка.
Комментарии:
1. Вы объединяетесь
home2019
в подзапросе. Когда вы помещаете вложенный запрос в предложение FROM, имяhome2019
больше не находится в области; имя понимается в вложенном запросе, но не во внешнем запросе. Очевидно, что результатом вложенного запроса является агрегация, а не исходная таблица. Вы должны предоставить подзапросу псевдоним — а также псевдоним столбца для средней цены внутри подзапроса — и ссылаться только на эти псевдонимы во внешнем запросе. Это поможет вам преодолеть текущую ошибку; скорее всего, вы столкнетесь с новыми.
Ответ №1:
Сделайте два подвыбора и соедините их
SELECT t2012.region_name, t2012.avgprice2012, t2019.avgprice2019 FROM (SELECT home2012.region_name, AVG(home2012.per_price) avgprice2012 FROM home2012 GROUP BY region_name) AS t2012 LEFT JOIN (SELECT region_name, AVG(per_price) avgprice2019 FROM home2019 GROUP BY region_name) AS t2019 ON t2012.region_name = t2019.region_name ;
Ответ №2:
select home2012.region_name, avg(home2012.per_price), avg(home2019.per_price) from home2012 left join (select region_name, avg(per_price) from home2019 group by region_name) on home2012.region_name = home2019.region_name group by region_name;
какая польза от присоединения, как упоминалось выше? имеет ли это какое-либо значение, вместо того, чтобы увеличивать нагрузку на сервер на один шаг.
select home2012.region_name, avg(home2012.per_price), avg(home2019.per_price) from home2012 left join home2019 on home2012.region_name = home2019.region_name group by region_name;
Комментарии:
1. Я хочу присоединиться вот так! выберите home2012.имя_региона, home2019.имя_региона, home2012.среднее значение(по_цене), home2019.среднее значение(по_цене) из (выберите имя_региона, среднее значение(по_цене) из группы home2012 по имя_региона) присоединяйтесь (выберите имя_региона, среднее значение(по_цене) из группы home2019 по имя_региона) на home2012.имя_региона = home2019.имя_региона ;
Ответ №3:
SELECT name, AVG("2012") as "2012", AVG("2018") as "2018" FROM ( SELECT 'region' AS name, 1 AS "2012", NULL AS "2018" // put column as null FROM dual UNION SELECT 'region' AS name, NULL AS "2012", // put column as null avg(3) AS "2018" FROM dual group by 1 ) GROUP BY name
не уверен в ваших требованиях, попробуйте что-нибудь подобное.