Столбцы SQL фильтруются по-разному

#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 быть включена в качестве параметра, конечно.