2015-12-05 2 views
2

Выполнение моей SQL-группы приводит к таблице ниже. Из этой таблицы мне нужно вычесть Qty с кодом = 'S' из Qty с кодом = 'B', когда цена и дата совпадают.SQL-запрос - db2/400 iseries

Например, в приведенной ниже таблице мне нужно значение, которое нужно сохранить в рабочей переменной.

1) 100-50 = 50 в течение первых 2-х строк
2) 60 -30 = 30 для 3-й и 4-й строки
3) В последней строке, так как он не имеет код 'S', он должен возвращать только 20

Таблица

Price Date  Code Sum(Qty) 
9.0  201512  B  100 
9.0  201512  S  50 
8.0  201506  B  60 
6.0  201506  S  30 
5.0  201508  B  20 

SQL запрос, используемый для получения приведенной выше таблицы

select Price, Date, Code,sum(Qty) from Table 
    where Type = 'A' and Acct = 'CLOSED' 
    group by Price,Date,Code 
    order by Price,Date 

Могу ли я изменить мой существующий оператор SQL, указанный выше, с использованием операторов CASE для получения моего требуемого результата. Я пробовал, но Cursor возвращает один на один ряд и СЛУЧАЙ, кажется, не работает

exec sql 
declare c1 cursor for 
select Price, Date, Code, 
Case when Code ='B' then ifnull(sum(Qty),0) 
    when Code ='S' then (-1 * ifnull(sum(Qty),0)) end 
from Table 

where Type = 'A' and Acct = 'CLOSED' 
group by Price,Date,Code 
order by Price,Date 

exec sql 
open c1 

exec sql 
fetch c1 into :var_price, :var_date, :var_code, :var_Bqty, :VarSqty 

Использование SQLRPGLE в системе ISeries.

ответ

4

Вы можете использовать условную агрегацию для этого:

select Price, Date, 
     sum(case when code = 'B' then Qty when code = 'S' then -QTY end) as diff 
from Table 
where Type = 'A' and Acct = 'CLOSED' 
group by Price, Date 
order by Price, Date; 
+0

Спасибо you..It работал отлично. – Peck