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

Дано две таблицы: t1 - сумма и количество дней, и t2 - пороговые значения количества дней.
Итогом нужно получить вот что: если кол-во дней из t1 меньше такового из t2, то плюсуем нарастающим итогом для каждого соответствующего значения из t2, иначе - нет. Если непонятно, пример ниже.

Я тут налобал что-то, но, очевидно, трешачок, и существует решение лучше.


select sum(summ),
       s
from
(       
select t1.summ,
       case when t1.days between 0 and t2.d then t2.d else 0 end s
       
from
(select 10 days, 10 summ from dual union all
select 16 days, 10 summ from dual union all
select 17 days, 20 summ from dual union all
select 30 days, 20 summ from dual union all
select 35 days, 30 summ from dual union all
select 90 days, 40 summ from dual union all
select 100 days, 100 summ from dual) t1,

(select 1 d from dual union all
select 5 from dual union all
select 10 from dual union all
select 20 from dual union all
select 30 from dual union all
select 90 from dual union all
select 9999 from dual) t2
)
where s > 0
group by s
order by s


Результат:
SUM(SUMM)      DAYS                                   
----------- ------------ 
10              10 
40              20 
60              30 
130             90 
230             9999 

я б, даже, наверно, так и оставил, но получить-то нужно вот это:
SUM(SUMM)      DAYS                                   
----------- ------------ 
0                1
0                5
10              10 
40              20 
60              30 
130             90 
230             9999 

- т.е. делать одно вхождение таблицы t2, что вообще не айс.

Как сделать иначе?
26 фев 13, 16:18    [13983853]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на знание sql  [new]
Стромпрстен
Guest
т.е. делать ещё одно вхождение таблицы t2, что вообще не айс.
26 фев 13, 16:25    [13983905]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на знание sql  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Стромпрстен,

RTFM outer joins. Да и вообще про соединения почитайте. Перекидывать условие соединения в CASE и потом фильтровать по нему во внешнем запросе -- решение не очень.

with t1 as (
select 10 days, 10 summ from dual union all
select 16 days, 10 summ from dual union all
select 17 days, 20 summ from dual union all
select 30 days, 20 summ from dual union all
select 35 days, 30 summ from dual union all
select 90 days, 40 summ from dual union all
select 100 days, 100 summ from dual
), t2 as(
select 1 d from dual union all
select 5 from dual union all
select 10 from dual union all
select 20 from dual union all
select 30 from dual union all
select 90 from dual union all
select 9999 from dual
)
select nvl(sum(t1.summ), 0) summ,
       t2.d days      
from t1, t2
where t1.days(+) between 0 and t2.d
group by t2.d
order by days
26 фев 13, 17:30    [13984379]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на знание sql  [new]
Стромпрстен
Guest
suPPLer,

спасибо. Что-то клина словил под конец дня(
26 фев 13, 17:39    [13984433]     Ответить | Цитировать Сообщить модератору
 Re: Задачка на знание sql  [new]
stax..
Guest
Стромпрстен
Как сделать иначе?

with t1 as
(select 10 days, 10 summ from dual union all
select 16 days, 10 summ from dual union all
select 17 days, 20 summ from dual union all
select 30 days, 20 summ from dual union all
select 35 days, 30 summ from dual union all
select 90 days, 40 summ from dual union all
select 100 days, 100 summ from dual),
t2 as
(select 1 d from dual union all
select 5 from dual union all
select 10 from dual union all
select 20 from dual union all
select 30 from dual union all
select 90 from dual union all
select 9999 from dual),
u as (
select t1.*,0 gr  from t1
union all
select t2.*,0,1 from t2
)
select * from
(select 
   days
  ,sum(summ) over (order by days) ss
  ,gr
 from u)
where 
 gr=1SQL> /

      DAYS         SS         GR
---------- ---------- ----------
         1          0          1
         5          0          1
        10         10          1
        20         40          1
        30         60          1
        90        130          1
      9999        230          1

7 rows selected.
/


.....
stax
27 фев 13, 10:32    [13986963]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить