SQL группируется по каждой таблице и присоединяется к ним

#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  

не уверен в ваших требованиях, попробуйте что-нибудь подобное.