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

Есть таблица в которой

ПОЛЕ1ПОЛЕ2ПОЛЕ3
11000000
21000000
34.271
349 997.861
349 997.861
41000000


ПОЛЕ1 и ПОЛЕ3 - это поля признаки. Если ПОЛЕ3 = 0, то пропускаем и ничего не делаем. Если ПОЛЕ3 = 1, то суммируем sum(ПОЛЕ2) over (partition by ПОЛЕ1) и проверяем равно ли оно 100000. Если нет, то необходимо к одной из строчек (в данном случае исследуются все строки для которых ПОЛЕ1 = 3) добавить столько сколько не хватает до 100000.

Вопрос: как бы грамотно прибавить недостающее? Неважно можно к первой или к последней строке (в данном случае три строки с признаком 3) добавлять. А именно как пересчитывать sum(ПОЛЕ2) over (partition by ПОЛЕ1) после прибавления, например к первой строчке. Как к последней или в середине прибавить пока не представляю даже.

Сама таблица (по простому) и insert'ы:

Create table summ (
field1 varchar2(25),
field2 varchar2(25),
field3 varchar2(25)
                         );

insert into summ values ('1','100000','0');
insert into summ values ('2','100000','0');
insert into summ values ('3','4.27','1');
insert into summ values ('3','49997.86','1');
insert into summ values ('3','49997.86','1');
insert into summ values ('4','100000','0');
29 июн 06, 16:01    [2826608]     Ответить | Цитировать Сообщить модератору
 Re: интересный запрос  [new]
О к у л и с т
Guest
Добавлю

Результат подправленный надо вывести в ПОЛЕ4 (подправленные значения ПОЛЕ2, если не трогали, то выводим в ПОЛЕ4 как есть из ПОЛЕ2). Вот как бы такая засада....
29 июн 06, 16:05    [2826638]     Ответить | Цитировать Сообщить модератору
 Re: интересный запрос  [new]
О к у л и с т
Guest
Можно конечно сделать вот так

ПОЛЕ1ПОЛЕ2ПОЛЕ3ПОЛЕ4
110000001
210000001
34.2711
349997.8612
349997.8613
4100000 01


а потом смотреть чтобы только 1 строке изменение внести.

где ПОЛЕ4 - row_number. Может кто что более интересное посоветовать может?
29 июн 06, 16:26    [2826797]     Ответить | Цитировать Сообщить модератору
 Re: интересный запрос  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
with t as(
select 1 f1, 100000 f2, 0 f3 from dual union all
select 2 f1, 100000 f2, 0 f3 from dual union all
select 3 f1, 4.27 f2, 1 f3 from dual union all
select 3 f1, 49997.86 f2, 1 f3 from dual union all
select 3 f1, 49997.86 f2, 1 f3 from dual union all
select 4 f1, 100000 f2, 0 f3 from dual
)
select f1, decode(rn, 1, 100000-s, 0)+f2 f2_new, f2 f2_old, f3
from       
(
select row_number() over (partition by f1 order by f2) rn, 
 decode(f3, 1, sum(f2) over (partition by f1), 100000) s, t.*
from t
)
29 июн 06, 16:43    [2826968]     Ответить | Цитировать Сообщить модератору
 Re: интересный запрос  [new]
Dmitry E. Loginov
Member

Откуда: Москва
Сообщений: 108
Коль речь об ORACLE 10 - самая задача для PIPELINE Function

RTFM:
PL/SQL User's Guide and Reference
10g Release 1 (10.1)
Part Number B10807-01
Chapter 11 Tuning PL/SQL Applications for Performance
Setting Up Transformation Pipelines with Table Functions
29 июн 06, 16:45    [2826987]     Ответить | Цитировать Сообщить модератору
 Re: интересный запрос  [new]
Sqaimes
Member

Откуда: Украина, Мариуполь
Сообщений: 443
автор
Если ПОЛЕ3 = 1, то суммируем sum(ПОЛЕ2) over (partition by ПОЛЕ1) и проверяем равно ли оно 100000. Если нет, то необходимо к одной из строчек (в данном случае исследуются все строки для которых ПОЛЕ1 = 3) добавить столько сколько не хватает до 100000.


запрос интересный жаль времени поизвращаться нет :(
непроверял, но может по логике, что типа:
select..., 

(select sum(field2)  over (partition by field1) from summ where field3=1 and field2<100000)
+ 
---сколько нужно добавить до 100000
  (select 100000-sum(field2) over (partition by field1) from summ where
   field3=1 and field2<100000)
  from summ....
типа: n+(100000-(n<100000)
29 июн 06, 17:06    [2827156]     Ответить | Цитировать Сообщить модератору
 Re: интересный запрос  [new]
Sqaimes
Member

Откуда: Украина, Мариуполь
Сообщений: 443
:) "интересный запрос"

SQL> select field2 old, sum(field2) over (partition by field1) O_ver,
  2   decode(field2, (
  3  case  when field2<100000 and field3=1 then
  4  field2 else '' end), (
  5  case  when field2<100000 and field3=1 and field2 not in (
  6  select field2 from summ where field2<100000 and field3=1 and rownum=1)
  7   then field2 else TO_CHAR(
  8   (
  9   select field2+0.01 from summ where field2<100000 and field3=1 and rownum=1))  end),
 10  ' ')  F4 from summ;
30 июн 06, 16:39    [2831651]     Ответить | Цитировать Сообщить модератору
 Re: интересный запрос  [new]
Sqaimes
Member

Откуда: Украина, Мариуполь
Сообщений: 443
ой не тот примерчик кинул
вместо 0.01 -
(select 100000-sum(field2) over (partition by field1) from summ where field2<100000 and field3=1 and rownum=1)
.......
30 июн 06, 16:46    [2831706]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить