2015-07-28 3 views
0

Мне нравится суммировать значения в таблице на основе условия, взятого из той же таблицы. Структура таблицы приведена ниже. Таблица называется DataУсловный SUM с оператором SELECT

Data 
Type Value 
1 5 
1 10 
1 15 
1 25 
1 15 
1 20 
1 5 
2 10 
3 5 

Если значение типа 2 больше, чем значение типа 3, то я хотел бы вычесть значение типа 2 от суммы всех значений в таблице. Я не уверен, как писать инструкции IF, используя значения, которые искали в таблице. Я пробовал ниже, но это не работает.

SELECT SUM(Value)-IF(SELECT Value FROM Data WHERE Type=2>SELECT Value 
FROM Data WHERE Type=3 THEN SELECT Value FROM Data 
WHERE Type=2 ELSE SELECT Value FROM Data WHERE Type=3) FROM Data 

или

SELECT SUM(d.Value)-IIF(a.type2>b.type3, a.type2, b.type3) 
FROM Data d, (SELECT Value AS type2 FROM Data WHERE Type=2) a, 
(SELECT Value AS type3 FROM Data WHERE Type=3) b 

ответ

0

Если я следовать вашей логике правильно, то это, казалось бы делать то, что вы хотите:

select d.value - (case when d2.value > d3.value then d2.value else 0 end) 
from data d cross join 
    (select value from data where type = 2) d2 cross join 
    (select value from data where type = 3) d3 ; 

EDIT:

Если вы хотите просто один номер, затем использовать условную агрегацию:

select sum(value) - 
     (case when sum(case when type = 2 then value else 0 end) > 
        sum(case when type = 3 then value else 0 end) 
       then sum(case when type = 2 then value else 0 end) 
       else 0 
     end) 
from data; 
0

Спасибо, что указал мне в правильном направлении. Это то, что я придумал в конце. Это немного отличается от ответа выше, поскольку я использую MS Access

SELECT SUM(Value)-IIf(SUM(IIf(Type=2, Value, 0)>SUM(IIf(Type=3, Value, 0), SUM(IIf(Type=2, Value, 0), SUM(IIf(Type=3, Value, 0) FROM Data

Это их так же, как второе предложение выше, но адаптированные к MS Access SQL.

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