#sql #oracle
#sql #Oracle
Вопрос:
Прошло много времени с тех пор, как я имел дело с SQL. Допустим, у меня есть транзакция таблицы со следующими столбцами: Компания, Год, Значение.
Я хочу создать результирующий набор, который суммирует общее значение для каждой компании, но в одном столбце я хочу 2015, а в другом 2016.
Company | Total 2015 | Total 2016 |
Звучит довольно просто, но я не смог в этом разобраться.
Должен ли я создавать два запроса, по одному на каждый год? Если да, то как я могу позже объединить оба результата?
Ответ №1:
Вот один из вариантов, использующий conditional aggregation
:
select company,
sum(case when year = 2015 then value end) total2015,
sum(case when year = 2016 then value end) total2016
from Transaction
group by company
Комментарии:
1. Это oracle 11g?
Ответ №2:
Это называется условной агрегацией.
select
company,
sum(case when year = 2015 then value else 0 end) as sum2015,
sum(case when year = 2016 then value else 0 end) as sum2016
from transaction
group by company
order by company;
Ответ №3:
Если логика вычислений немного сложна, передайте ее определяемой пользователем функции.
Подсказка:
SELECT company, f_total(2015) total_2016, f_total(2016) total_2016;
Здесь вы пишете только одну функцию f_total()
, которая принимает year в качестве параметра.
Комментарии:
1. Это действительно плохой совет.
2. Ну, написать пользовательскую функцию агрегации тоже может быть сложно 😉 В любом случае, эта функция также должна
value
быть включена в качестве параметра, конечно.