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

Откуда: Электросталь
Сообщений: 98
Есть запрос:
with t as (
     select 388 p_id, 449 b_id, 2 sost, 35 C1 from dual union all
     select 388 p_id, 449 b_id, 8 sost, 135 C1 from dual union all
     select 388 p_id, 445 b_id, 1 sost, 235 C1 from dual union all
     select 3 p_id, 85 b_id, 1 sost, 35 C1 from dual union all
     select 3 p_id, 85 b_id, 4 sost, 121235 C1 from dual union all
     select 3 p_id, 381 b_id, 2 sost, 38555 C1 from dual)
select p_id, b_id, sost8 sost, NVL(c1,0)  
from t  partition by (p_id, b_id) 
right join (select level sost8 from dual connect by level<=8) s
   on t.sost=s.sost8
возвращает данные:
P_ID	B_ID	SOST	NVL(C1,0)
3 85 1 35
3 85 2 0
3 85 3 0
3 85 4 121235
3 85 5 0
3 85 6 0
3 85 7 0
3 85 8 0
3 381 1 0
3 381 2 38555
3 381 3 0
3 381 4 0
3 381 5 0
3 381 6 0
3 381 7 0
3 381 8 0
388 445 1 235
388 445 2 0
388 445 3 0
388 445 4 0
388 445 5 0
388 445 6 0
388 445 7 0
388 445 8 0
388 449 1 0
388 449 2 35
388 449 3 0
388 449 4 0
388 449 5 0
388 449 6 0
388 449 7 0
388 449 8 135

В каждой группе (P_ID, B_ID) нужно добавить столбец PERSENT в котором вычислить : P4 = C5 / C6 * 100, P7 = C2*C1+C6 и т.д, где С1, С2, .... С8 соответствующие строки в группе, а Р1, Р2, ...., Р8 - это строки в столбце PERCENT, куда записать результат
Т.е. необходимо в пределах окна обращаться к строкам по номеру.
P_ID	B_ID	SOST	NVL(C1,0)		PERSENT
3 85 1 35
3 85 2 0
3 85 3 0
3 85 4 121235 121235 / 35 * 100 346385,7143
3 85 5 0
3 85 6 0 121235 / 35 + 35 3498,857143
3 85 7 0
3 85 8 0

Как это сделать?
12 апр 11, 11:25    [10505095]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
AmKad
Member

Откуда:
Сообщений: 5222
marinaS,

11.2 NTH_VALUE
12 апр 11, 11:34    [10505153]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
marinaS
Member

Откуда: Электросталь
Сообщений: 98
AmKad
marinaS,

11.2 NTH_VALUE


Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
12 апр 11, 11:40    [10505202]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
AmKad
Member

Откуда:
Сообщений: 5222
marinaS,

row_number + case/decode + lag/lead
Ну или объясните, почему у Вас формулы одни, а вычисления другие.
12 апр 11, 11:44    [10505237]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Хотя если SOST всегда будет иметь такой вид, row_number не нужен.
12 апр 11, 11:59    [10505345]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
marinaS
Member

Откуда: Электросталь
Сообщений: 98
AmKad
marinaS,

Ну или объясните, почему у Вас формулы одни, а вычисления другие.


Формулы очень разные и мудрёные(я их не привоже в чистом виде), вот такая постановка, а вычисления я для примера написала, ну чтобы понятно было... что и куда пишем...Похоже только запутала.
12 апр 11, 12:29    [10505529]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
-2-
Member

Откуда:
Сообщений: 15330
marinaS
Формулы очень разные и мудрёные(я их не привоже в чистом виде)
И не соответствуют приведенном резульатату
with t as (
     select 388 p_id, 449 b_id, 2 sost, 35 C1 from dual union all
     select 388 p_id, 449 b_id, 8 sost, 135 C1 from dual union all
     select 388 p_id, 445 b_id, 1 sost, 235 C1 from dual union all
     select 3 p_id, 85 b_id, 1 sost, 35 C1 from dual union all
     select 3 p_id, 85 b_id, 4 sost, 121235 C1 from dual union all
     select 3 p_id, 381 b_id, 2 sost, 38555 C1 from dual)
select *
from t
model ignore nav 
partition by (p_id, b_id) dimension by (sost) measures(c1, 0 percent)
rules (
   c1[for sost from 1 to 8 increment 1] = c1[cv()],
--   P4 = C5 / C6 * 100, P7 = C2*C1+C6
   percent[4] = case when c1[1]<>0 then c1[4]/c1[1]*100   end,
   percent[7] = case when c1[1]<>0 then c1[4]/c1[1]+c1[1] end
);
12 апр 11, 12:44    [10505641]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
-2-
Member

Откуда:
Сообщений: 15330
measures(c1, cast(null as number) percent)
12 апр 11, 12:48    [10505674]     Ответить | Цитировать Сообщить модератору
 Re: Обратиться по номеру строки в окне аналитической функции  [new]
marinaS
Member

Откуда: Электросталь
Сообщений: 98
-2-
marinaS
Формулы очень разные и мудрёные(я их не привоже в чистом виде)
И не соответствуют приведенном резульатату
with t as (
     select 388 p_id, 449 b_id, 2 sost, 35 C1 from dual union all
     select 388 p_id, 449 b_id, 8 sost, 135 C1 from dual union all
     select 388 p_id, 445 b_id, 1 sost, 235 C1 from dual union all
     select 3 p_id, 85 b_id, 1 sost, 35 C1 from dual union all
     select 3 p_id, 85 b_id, 4 sost, 121235 C1 from dual union all
     select 3 p_id, 381 b_id, 2 sost, 38555 C1 from dual)
select *
from t
model ignore nav 
partition by (p_id, b_id) dimension by (sost) measures(c1, 0 percent)
rules (
   c1[for sost from 1 to 8 increment 1] = c1[cv()],
--   P4 = C5 / C6 * 100, P7 = C2*C1+C6
   percent[4] = case when c1[1]<>0 then c1[4]/c1[1]*100   end,
   percent[7] = case when c1[1]<>0 then c1[4]/c1[1]+c1[1] end
);


Спасибо
12 апр 11, 12:58    [10505740]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить