Помогите с запросом SQL

AcsD
Дата: 09.03.2011 11:36:44
Подскажите пожалуйста как сделать запросом SQL
Надо написать отчет.
Идеология простая берем балансы (список) и остатки , группируем по балансам
select
bal, sum(rest)
from account
where bal in ('1','2','3','4','5')
group by bal
получаем выборку
например
1 30
2 30
3 30
4 50
5 20

Но по условиям отчета баланс 2 и 3 должны попадать в отчет при следующих условиях
Если 2 - 3 > 0 тогда остаток иначе 0
тоже самое 4 и 5
после этого нужно посчитать общую сумму по всем этим балансовым с условиями 2,3,4 и 5
Пытался использовать case и decode.
Но проблема(пример баланса 2 -3), чтобы узнать остаток баланса 3, приходится бежать подселектом еще раз по счетам и собирать сумму. Тоже самое по 4 и 5.
И как в таком случае обработать попадание балансов с условием, ведь и case и decode
обработают балансы 2,3,4,5 отдельно. И попадут в отчет два раза.
Подскажите как подобное можно реализовать, а то я что то совсем запутался?
env
Дата: 09.03.2011 12:12:32
AcsD,

Приведите постановку в виде а-ля 9922627, и люди к вам потянутся.

з.ы. навскидку lag/lead и обработка поверх
AcsD
Дата: 09.03.2011 13:33:51
AcsD,
Прошу прощения.
Привожу в соответствие.

Таблица account:

-- drop table account;
create table account(bal varchar2(1), acc varchar2(20), rest number);
insert into account(bal , acc , rest ) values ('1','111111111', 30);
insert into account(bal , acc , rest ) values ('2','222222222', 30);
insert into account(bal , acc , rest ) values ('3','333333333', 30);
insert into account(bal , acc , rest ) values ('4','444444444', 50);
insert into account(bal , acc , rest ) values ('5','555555555', 20);

В реальности счетов намного больше отсюда и sum ,и group by


select a.bal,sum(a.rest) from account a
group by a.bal

после этого надоп посчитать итоговую сумму но с условиями балансовых 2,3,4,5
т.е
2-3 = 0 в отчет должен попасть 0
4-5 = 30 в отчет уйдет 30
т.е. общий итог в отчет должна попасть сумму 60
SysOper
Дата: 09.03.2011 14:10:22
AcsD,

А результат в каком виде хотите увидеть?
env
Дата: 09.03.2011 14:12:28
AcsD,

Пример результата покажите

with t as ( select '1' bal,'111111111' acc, 30 rest from dual union all
            select '2','222222222', 30 from dual union all
            select '3','333333333', 30 from dual union all
            select '4','444444444', 50 from dual union all
            select '5','555555555', 20 from dual),
     gr as (select '1' grp, '1' bal, 1 sign from dual union all
            select '2-3', '2', 1 sign from dual union all
            select '2-3', '3', -1 from dual union all
            select '4-5', '4', 1 from dual union all
            select '4-5', '5', -1 from dual)
select gr.grp, greatest(sum(t.rest*gr.sign),0) sm
from t, gr
where t.bal=gr.bal
group by gr.grp;

GRP SM                     
--- ---------------------- 
1   30                     
2-3 0                      
4-5 30                     
SysOper
Дата: 09.03.2011 14:15:28
AcsD,

WITH t AS (
select a.bal,sum(a.rest) s,
  CASE WHEN bal IN(2,3) THEN '2'
       WHEN bal IN(4,5) THEN '4'
       ELSE bal
  END z
  from account a
 group by a.bal)
 
 SELECT z, decode(count(*), 1, max(s), MAX(s)-MIN(s))
 FROM t
 GROUP BY z
env
Дата: 09.03.2011 14:21:10
SysOper,

эммм... т.е. '2-3' == '3-2'?
AcsD
Дата: 09.03.2011 14:43:28
результат в отчете

Напримере SysOper,

WITH t AS (
select a.bal,sum(a.rest) s,
CASE WHEN bal IN(2,3) THEN '2'
WHEN bal IN(4,5) THEN '4'
ELSE bal
END z
from account a
group by a.bal)

select 'по балансу', sum(rest) from
(SELECT z, decode(count(*), 1, max(s), MAX(s)-MIN(s)) rest
FROM t
GROUP BY z)

по балансу 60
env
Дата: 09.03.2011 15:10:37
AcsD,

with account as ( select '1' bal,'111111111' acc, 30 rest from dual union all
            select '2','222222222', 30 from dual union all
            select '3','333333333', 40 from dual union all
            select '4','444444444', 50 from dual union all
            select '5','555555555', 20 from dual),
t AS (
select a.bal,sum(a.rest) s,
  CASE WHEN bal IN(2,3) THEN '2'
       WHEN bal IN(4,5) THEN '4'
       ELSE bal
  END z
  from account a
 group by a.bal)
 SELECT z, decode(count(*), 1, max(s), MAX(s)-MIN(s))
 FROM t
 GROUP BY z;

Z DECODE(COUNT(*),1,MAX(S),MAX(S)-MIN(S)) 
- --------------------------------------- 
1 30                                      
2 10                                      
4 30                                      

AcsD
Дата: 09.03.2011 15:32:13
env,

Огромное спасибо!!!
Идею понял, пошел реализовывать.