#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 стоит а??