powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / значение в диапазоне
25 сообщений из 31, страница 1 из 2
значение в диапазоне
    #39397844
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
подскажите пожалуйста с запросом. Есть таблица вида
Код: sql
1.
2.
3.
4.
5.
ID     PERIOD     Amount
1         1            15
2         31          12
3         91          10 
4         181        8 


как выбрать Amount в зависимости от моего периода.
к примеру если 1 то выбрать 15
если 20 то получается от 2 до 30 выбрать 12
если 40 то получается от 31 до 90 выбрать 10
если 100 то выбрать 10
если (мой период) больше 181 выбрать 8
lag/lead + как то between пробовал хорошего результата не получил.
Заранее спасибо!
...
Рейтинг: 0 / 0
значение в диапазоне
    #39397852
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitlag/lead + как то between пробовал хорошего результата не получил.
покажи что получил
...
Рейтинг: 0 / 0
значение в диапазоне
    #39397873
фетч фёст
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxwait,

групповой first или сортировка
...
Рейтинг: 0 / 0
значение в диапазоне
    #39397875
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

1 lag/lead + одна строка в таблице
2 первая запись где PERIOD<=мой период
3 ..
...
Рейтинг: 0 / 0
значение в диапазоне
    #39397876
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,

я пытался чтот подобное состряпать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare 
       v_period number:=26;
begin    
    with qq as
    (
      select 1 as period, 15 Amount from dual
      union all
      select 31 as period, 12 Amount from dual
      union all
      select 91 as period, 10 Amount from dual
      union all
      select 181 as period, 8 Amount from dual
    )
    select period
           , LEAD (period,1) over (ORDER BY period) AS next_period 
           , Amount 
    from qq
    where v_period between period and LEAD (period,1) over (ORDER BY period) AS next_period;
end;
...
Рейтинг: 0 / 0
значение в диапазоне
    #39397922
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

только ты сам определись на хвост наступаем или нет
авторесли 1 то выбрать 15
от 31 до 90 выбрать 10 у тя 31=12
...
Рейтинг: 0 / 0
значение в диапазоне
    #39397970
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,

на Хвост не наступаем, -1
т.е. в периоде от 31 до 90 мы выбрать должны 12
а уже новый период смотрим с 91 до 180 должны выбрать 10
ну и т.д.

конечно вроде сделал но не уверен
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT id, PERIOD, next_period , AMOUNT 
FROM (
  SELECT id
         , PERIOD
         , LEAD (period,1) over (ORDER BY period) AS next_period
         , AMOUNT 
  FROM tbl_TempAmoun
) 
WHERE '31' between PERIOD and nvl(next_period,99999999)-1



в таблице tbl_TempAmoun эти значения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 with qq as
    (
      select 1 as period, 15 Amount from dual
      union all
      select 31 as period, 12 Amount from dual
      union all
      select 91 as period, 10 Amount from dual
      union all
      select 181 as period, 8 Amount from dual
    )
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398211
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернусь к своему решению, не верно оно. точнее суть такая что я не могу передать идентификаторы в подзапрос, можете подсказать чтот ума не приложу как сделать...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT p.Id
       ,(
          SELECT Amount
          FROM(
            select tfsc.PERIOD
                   , LEAD (tfsc.PERIOD,1) over (ORDER BY tfsc.PERIOD) AS next_period
                   , tfsc.Amount
            from tariff tarif
                  join tariff_s tfsc on tfsc.tariff_id = tarif.Id+1 and tfsc.cell_type_id = 148 --cell.type_id /*invalid identifier*/
            where tarif.Id = 260-- p.tarif_id /*invalid identifier*/
          )
          WHERE p.period between PERIOD and nvl(next_period,99999999)-1 
       ) Amount
FROM contract c
   JOIN prol p on p.Contract_Id = c.id
   JOIN cell cell on p.cell_id = cell.id
where c.Id = 6315
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398219
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitможете подсказать чтот ума не приложу как сделать
прикладывай
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398242
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

Соедини все, потом выполняй аналитику.
Если хочется извернуться - используй второй способ отсюда Ansi join .
Третья альтернатива - PL/SQL функция.

123ййmaxwaitможете подсказать чтот ума не приложу как сделать
прикладывай У него проблема не столько в inline view сколько в двойной вложенности в скаляре.
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398250
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Да про функцию уже подумал, передать туда идентификаторы и вернуть нужный Amount, наверное им и воспользуюсь...
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398268
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

по ссылке, 3 постами ниже, твой пример скаляра
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398289
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,

Если я правильно понял, то как-то так надо сделать?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
    ( SELECT 
             Amount
      FROM
            table(cast(multiset(select tfsc.PERIOD
                   , LEAD (tfsc.PERIOD,1) over (ORDER BY tfsc.PERIOD) AS next_period
                   , tfsc.Amount
            from tariff tarif
            join tariff_scale tfsc on tfsc.tariff_id = tarif.Id+1 and tfsc.cell_type_id = cell.type_id /*148*/ --cell.type_id /*invalid identifier*/
            where tarif.Id = p.tariff_id --260-- p.tarif_id /*invalid identifier*/
          ) as sys.odcivarchar2list ))z
          WHERE p.period between PERIOD and nvl(next_period,99999999)-1 
     ) as Amount
FROM contract c
   JOIN contract_prolongation p on p.Contract_Id = c.id
   JOIN cell cell on p.cell_id = cell.id
where c.Id = 6315 



но ошибка осталась...
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398296
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

бездумное копирование ни к чему хорошему не приводило.
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398299
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,

Да просто уже вечер, голова не варит*(
...
Рейтинг: 0 / 0
значение в диапазоне
    #39398797
hexcept
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with qq as
(
  select 1 as period, 15 amount from dual
  union all
  select 31 as period, 12 amount from dual
  union all
  select 91 as period, 10 amount from dual
  union all
  select 181 as period, 8 amount from dual
)
select
 :nod n_of_days,
 nvl(
  max(case when qq.period>=:nod then qq.amount end) keep(dense_rank first order by qq.period),
  max(qq.amount) keep(dense_rank last order by qq.period)) amount
from qq
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399777
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hexcept, Спасибо!
но сделал по своему пока как понимаю. создал функцию и передаю туда параметры и возвращаю результат. Но Ваш пример обязательно разберу.
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399782
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня.
Еще столкнулся с такой трудностью, можете подсказать.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Ранее пару постов назад делал функцию в итоге получилаю результат
Счет       Остаток  Клиент             Сумма  РангГруппы
123456      123      Иванов И.И.     1         6 
123456      123      Иванов И.И.     2         6
123456      123      Иванов И.И.     3         7
123456      123      Иванов И.И.     3         7
123456      123      Иванов И.И.     4         8
123456      123      Иванов И.И.     5         9
123456      123      Иванов И.И.     3         9
123456      123      Иванов И.И.     1         9



ранг группы ввел для того чтобы сгруппировать и затем разнести сумму в нужный столбец
Код: sql
1.
2.
3.
4.
5.
select  t.Account, t.Ost, t.FioClient, sum(v_sum) Ssum, rankgroup
from table(get_tab_ptf('01.01.2017')) t
where  t.Day > '01.01.2017' and
        t.NomDog = 9
Group by t."Account", t.Ost, t.NomDog, rankgroup



получаю такое результат
Код: sql
1.
2.
3.
4.
123456      123      Иванов И.И.     3         6 
123456      123      Иванов И.И.     6         7
123456      123      Иванов И.И.     4         8
123456      123      Иванов И.И.     9         9



Подскажите пожалуйста как мне получить такое результат
Код: sql
1.
2.
счет         Остаток  Клиент           col1   col2   col3   col4   col5   col6    col7    col8    col9    col10         
123456      123      Иванов И.И.                                            3       6        4        9



пробовал pivot'ом не получилось, пробовал case'ом тоже не то...
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399797
maxwaitне получилосьстоит выбрать профессию по способностям.
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399800
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по непотребностям,
Ну почему бы просто не подсказать, и не говорить гадостей, есть же просто новички, которые впервые столкнулись с проблемой. не понимаю таких людей, вы тоже все знали с пеленок и не спрашивали ни у кого ничего?)
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399823
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

Всё просто :


with t as (
select 123456 n1, 123 n2, 'Иванов И.И.' name, 1 summary , '6' rang from dual union all
select 123456 , 123 , 'Иванов И.И.' , 2 , '6' from dual union all
select 123456 , 123 , 'Иванов И.И.' , 3 , '7' from dual union all
select 123456 , 123 , 'Иванов И.И.' , 3 , '7' from dual union all
select 123456 , 123 , 'Иванов И.И.' , 4 , '8' from dual union all
select 123456 , 123 , 'Иванов И.И.' , 5 , '9' from dual union all
select 123456 , 123 , 'Иванов И.И.' , 3 , '9' from dual union all
select 123456 , 123 , 'Иванов И.И.' , 1 , '9' from dual
)
select * from t
PIVOT ( sum(summary) as rang for rang in ('1' as a1,'2' as a2,'3' as a3,'4' as a4,'5' as a5 ,'6' as a6 ,'7' as a7 ,'8' as a8 ,'9' as a9))
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399827
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitНу почему бы просто не подсказать, и не говорить гадостей, есть же просто новички, которые впервые столкнулись с проблемой. не понимаю таких людей, вы тоже все знали с пеленок и не спрашивали ни у кого ничего?)А ты не лги:
maxwaitпробовал pivot'ом не получилось, пробовал case'ом тоже не то...
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399838
maxwait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

я не лгу, я всегда стараюсь сначала сам попробовать, а потом если не получается спрашивать.
понял в чем мой pivot не верный был, я разворачивал не по рангу а по сумме.

fortnet , Спасибо!
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399850
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwaitя не лгу, я всегда стараюсь сначала сам попробовать, а потом если не получается спрашивать.
понял в чем мой pivot не верный был, я разворачивал не по рангу а по сумме.Если ты не хочешь демонстрировать свои попытки - ты лжёшь.
...
Рейтинг: 0 / 0
значение в диапазоне
    #39399856
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxwait,

Вы определитесь какие периоды что должны возвращать.
1 вернёт 15
2-30(или 31) вернёт 15 или 12?
31(или 30)-90(или 91) вернёт 10 или 12?
91(или 90)-180(или 181) вернёт 10 или 8?
181+(или 180+) вернёт 8?

Понятно только одно: 1 должен вернуть 15 и 181+ должен возвращать 8, остальное, видимо, меняется от коммента к комменту.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / значение в диапазоне
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]