2015-03-06 3 views
1

Я использую Oracle.SQL Условное агрегирование

Имея таблицу:

Year Type Value 
2011 1  500 
2011 2  550 
2011 3  600 
... 
... 
2012 1  600 
2012 2  750 
2012 3  930 

мне нужно вычесть все значения различных типов, сгруппированных по годам. Операция будет:

В 2011 -> 1-2-3 (500-550-600)

В 2012 -> 1-2-3 (600-750-930)

Для ...

результат Шоуда быть:

Year Value 
2011 -650 
2012 -1080 
... ... 

я не мог сделать это, но здесь на переполнение стека, этот запрос был предложен, и она работала:

select sum(case when type = 1 then value else - value end) as value 
from table t 
group by year; 

Но теперь у меня другая ситуация. Мне нужно сделать то же самое, но не 1-2-3-4-5 -... Но 1 + 2-3-4-5-6 ....

К этому я попробовал эти оба запроса , без успеха:

select sum(case when type = 1 then value when type = 2 then value else - value end) as value 
from table t 
group by year; 

Это привело к тому, что второе значение имеет удвоенное значение.

select sum(case when type = 1 then value else - value end)+case when type =  2 then value as value 
from table t 
group by year; 

Это привело к правильному значению типа 2, но, так как этот тип 2 accurs только через несколько лет, в другие годы появляются утратившим. Итак, окончательный расчет правильный для типа 2 (годы, в котором он находится), но для каждого другого года, для каждого типа 2 не существует, он возвращает null.

Я просто не могу заставить этот запрос работать .. Любая идея была бы принята с благодарностью! Thanks

ответ

2

Определение того, должно ли число рассматриваться как положительное или отрицательное, должно произойти внутри вашей агрегации SUM(). Итак:

select sum(case when type = 1 OR type = 2 then value else - value end) 
from table t 
group by year; 

Поскольку оба 1 и 2 являются положительными в вашем 1 + 2-3-4-5-6 ... формула (1 положительны подразумевается), так что вам нужно или, чтобы убедиться, оба являются положительными, а все остальное отрицательным. Тогда это будет суммировано и ваше золото.

0

Короткая версия с sign используется:

select year, sum(sign(-type+2.5)*value) from table t group by year 
1

Для полноты картины, два альтернативных решения:

select sum(case when type in (1, 2) then value else -value end) 
from t 
group by year; 

Или, используя простое выражение случай:

select sum(case type 
      when 1 then value 
      when 2 then value 
      else -value 
      end) 
from t 
group by year; 
+0

Привет, спасибо для ответа. Разве второй вопрос не совпадает с моей первой попыткой? Он удвоил стоимость. В качестве примера. Значение было 1000, которое должно быть добавлено к 500, в результате получилось 1500. При этом он добавил 2000, являясь итоговым результатом 2500 .. странно .. –

+0

@ valter.vx Это небольшое изменение в синтаксисе, который вы пробовали ,Как я сказал «ради полноты». Однако я не могу объяснить поведение, которое вы наблюдали. Все эти запросы (ваш, мой, JNevill's) должны давать точный результат. На самом деле они сделали это на моей тестовой системе Oracle 11g XE. –

Смежные вопросы