cte ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ MYSQL

#mysql #sql #join #common-table-expression

Вопрос:

У меня есть этот стол(называемый пробным).:

 a, id1, year1, year2, val1, val2
1, A01, 2015, 2025, 17.20, 18.30
2, A02, 2014, 2024, 13.20,  7.80
3, A04, 2013, 2024, 10.00, 10.00
4, A03, 2024, 2014, 12.20,  8.80
5, A05, 2024, 2014,  0.00,  6.00
 

«год1» относится к значениям в столбце «val1», «год2» — к значениям в столбце «val2».

Я хочу получить итоговые данные по всем значениям, сгруппированным по годам.

Поэтому я хотел бы увидеть такой результат, как:

 Year    Value per year
2013    10.0
2014    28.0
2015    17.2
2024    30.0
2025    18.3
 

Я настроил общее табличное выражение(cte) с помощью самостоятельного соединения, чтобы сделать это следующим образом:

 SELECT  t1.year1, t2.year2, t1.val1, t2.val2,  t1.val1 t2.val2 AS val_tot FROM trial t1 FULL OUTER JOIN trial t2 ON t1.year1 = t2.year2  GROUP BY t1.year1;
 

(Первые четыре выходных столбца добавляются, чтобы получить четкое представление о том, что происходит)

На выходе получается:

 year1   year2   val1    val2    val_tot
2013    NULL    10.0    NULL    NULL
NULL    2025    NULL    18.3    NULL
2015    NULL    17.2    NULL    NULL
2014    2014    13.2     6.0    19.2
2024    2024     0.0     7.8     7.8
 

Вывод, очевидно, просто неверен.

Я попытался внести изменения в приведенную выше инструкцию SELECT, такие как изменение типа СОЕДИНЕНИЯ, изменение предложения GROUP BY или исключение его, а также добавление предложения WHERE, но безуспешно. Я безрезультатно гуглил и читал веб-сайты, так как не могу найти похожий пример, хотя должно быть много одинаковых вопросов.

Большое спасибо за любую помощь.

Ответ №1:

Если я правильно понимаю, вы хотите распаковать, а затем объединить. Одним из методов является:

 select year, sum(val)
from ((select year1 as year, val1 as val from trial t) union all
      (select year2, val2 from trial t)
     ) t
group by year
order by year;
 

Комментарии:

1. Привет @GordonLinoff. Во-первых, я признаю, что никогда не использовал UNION ALL. На самом деле я ничего об этом не знаю, так что большое вам спасибо. Во-вторых, не делая это учебником по SQL, почему не нужно вводить: year2 AS year, val2 AS val from trial t в вашей строке 3 выше? И почему t перед группой by в строке 4 стоит а??