Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Не могу построить запрос - помогите, пожалуйста...  [new]
Amberit
Member

Откуда: Киев
Сообщений: 765
Здравствуйте, уважаемые форумчане!

Помогите, пожалуйста, решить простую на первый взгляд задачку:

Имеется табличка операций с договорами вида:

№ операции № договора Сумма операции
----------------------------------------------------------------
1 000000001 1000.00
2 000000002 1000.00
3 000000003 2000.00
4 000000005 5000.00
5 000000114 400.00
6 000000232 1000.00
7 000000233 2000.00

В результате нужно получить отчет (договора с упорядоченными по росту номерами без промежутков необходимо сгруппировать между собой) такого вида:

№ договоров Сумма операции
--------------------------------------------
000000001-000000003 4000.00
000000005 5000.00
000000114 400.00
000000232-000000233 3000.00

C виду вроде бы все просто, но как реализовать данный отчет красиво и просто - ума не приложу. Форумчане, буду благодарен за помощь, заранее спасибо!
15 фев 07, 22:32    [3793457]     Ответить | Цитировать Сообщить модератору
 Re: Не могу построить запрос - помогите, пожалуйста...  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Assuming № договора is a "numeric string":

SQL> create table amberit(operation number, agreement varchar2(9), amount number);

Table created.

SQL> insert into amberit values(1,'000000001',1000.00);

1 row created.

SQL> insert into amberit values(2,'000000002',1000.00);

1 row created.

SQL> insert into amberit values(3,'000000003',2000.00);

1 row created.

SQL> insert into amberit values(4,'000000005',5000.00);

1 row created.

SQL> insert into amberit values(5,'000000114',400.00);

1 row created.

SQL> insert into amberit values(6,'000000232',1000.00);

1 row created.

SQL> insert into amberit values(7,'000000233',2000.00);

1 row created.

SQL> commit;

Commit complete.

SQL> select  case count(*) when 1 then min(agreement) else min(agreement) || '-' || max(agreement) end agreements,
  2          sum(amount) amount
  3    from  (
  4           select  agreement,
  5                   amount,
  6                   to_number(agreement) + row_number() over(order by to_number(agreement) desc) group_id
  7             from  amberit
  8          )
  9    group by group_id
 10    order by min(agreement);

AGREEMENTS               AMOUNT
-------------------- ----------
000000001-000000003        4000
000000005                  5000
000000114                   400
000000232-000000233        3000

SQL> 

SY.

Сообщение было отредактировано: 16 фев 07, 00:11
16 фев 07, 00:10    [3793657]     Ответить | Цитировать Сообщить модератору
 Re: Не могу построить запрос - помогите, пожалуйста...  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116272
with tab1 as
(select 1 col1, '000000001' col2, 1000.00 amount
 from dual
 union all
select 2 col1, '000000002' col2, 2000.00 amount
 from dual
 union all
select 3 col1, '000000003' col2, 2000.00 amount
 from dual
 union all
select 4 col1, '000000005' col2, 5000.00 amount
 from dual
 union all
select 5 col1, '000000114' col2, 400.00 amount
 from dual
 union all
select 6 col1, '000000232' col2, 1000.00 amount
 from dual
 union all
select 7 col1, '000000233' col2, 2000.00 amount
 from dual
order by 1
)
select min(col2)||DECODE(min(diff),1,'-')||DECODE(min(diff), 1, max(col2)) bounds, sum(amount)
from
(select col1, col2, amount, diff, sum(start_of_group) over (order by col1) group_no
from
(select col1, col2, to_number(col2) - to_number(lag(col2,1,0) over (order by col1)) diff, 
                    CASE WHEN to_number(col2) - to_number(lag(col2,1,0) over (order by col1)) = 1 THEN 0 ELSE 1 END start_of_group, amount 
from tab1))
group by group_no
order by group_no
/
BOUNDS SUM(AMOUNT) 
000000001-000000003 5000 
000000005 5000 
000000114 400 
000000232-000000233 3000 
16 фев 07, 00:11    [3793659]     Ответить | Цитировать Сообщить модератору
 Re: Не могу построить запрос - помогите, пожалуйста...  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Actually, I got a bit blinded by sample data. Most likely same № договора can appear multiple times. So it should be DENSE_RANK rather than ROW_NUMBER.

SY.
16 фев 07, 00:30    [3793686]     Ответить | Цитировать Сообщить модератору
 Re: Не могу построить запрос - помогите, пожалуйста...  [new]
Amberit
Member

Откуда: Киев
Сообщений: 765
Спасибо, SY, Ваш запрос мне очень помог! ;-)
17 фев 07, 01:40    [3799825]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить