Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 oracle sql задача  [new]
Никодим 2
Guest
Имееца:
with tab as (
select 1 a,2 b,50 amt from dual
union
select 3 a,null b,40 amt  from dual
union
select 5 a,null b,30 amt  from dual
union
select 7 a,8 b,70 amt  from dual
)
select ... from tab


Требуецца получить:
1250
12-50
3null40
5null30
7870
78-70


То есть если заполнено поле tab.b нужно продублировать эту строку с отрицат. amt
25 сен 07, 13:06    [4711187]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Никодим 2
Guest
вариант нужен без union
25 сен 07, 13:06    [4711192]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
Лобовой перевод Вашего текста на sql

SQL> with tab as (
  2  select 1 a,2 b,50 amt from dual
  3  union
  4  select 3 a,null b,40 amt  from dual
  5  union
  6  select 5 a,null b,30 amt  from dual
  7  union
  8  select 7 a,8 b,70 amt  from dual
  9  )
 10  select a, b, amt
 11    from tab
 12  union all
 13  select a, b, -amt from tab where b is not null order by a, amt desc
 14  /
 
         A          B        AMT
---------- ---------- ----------
         1          2         50
         1          2        -50
         3                    40
         5                    30
         7          8         70
         7          8        -70
 
6 rows selected
 
SQL> 
25 сен 07, 13:09    [4711210]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Двухстрочный PIVOT + LEFT JOIN + CASE...
25 сен 07, 13:10    [4711227]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Бабичев Сергей
Двухстрочный PIVOT + LEFT JOIN + CASE...
LEFT JOIN нафиг не нужен...
25 сен 07, 13:12    [4711240]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
Бабичев Сергей
Двухстрочный PIVOT + LEFT JOIN + CASE...


По твоим нотам :-)
Правда DISTINCT раздражает ...

SQL> with tab as (
  2  select 1 a,2 b,50 amt from dual
  3  union
  4  select 3 a,null b,40 amt  from dual
  5  union
  6  select 5 a,null b,30 amt  from dual
  7  union
  8  select 7 a,8 b,70 amt  from dual
  9  )
 10  select distinct a,
 11                  b,
 12                  CASE
 13                    WHEN b is not null and rn = 2 then
 14                     -amt
 15                    else
 16                     amt
 17                  end amt
 18    from tab, (select rownum rn from all_tables where rownum <= 2)
 19   order by a, b, amt desc
 20  /
 
         A          B        AMT
---------- ---------- ----------
         1          2         50
         1          2        -50
         3                    40
         5                    30
         7          8         70
         7          8        -70
 
6 rows selected
 
SQL> 
25 сен 07, 13:15    [4711258]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
with 
-- Твои тестовые данные
tab as (
select 1 a,2 b,50 amt from dual
union
select 3 a,null b,40 amt  from dual
union
select 5 a,null b,30 amt  from dual
union
select 7 a,8 b,70 amt  from dual
),
-- Двустрочный PIVOT
pivot as(select 1 as rn from dual union all select 2 from dual)
--
--
-- Непосредственно сам запрос
select a,b, decode(pivot.rn,2,-amt,amt) as amt
  from tab, pivot
 where case 
         when pivot.rn = 1 then 1
         when tab.b is not null and pivot.rn = 2 then 1
         else 0
       end = 1
order by a,b,rn

Query finished, retrieving results...

 A     B    AMT
---   ---   ---
  1     2    50
  1     2   -50
  3          40
  5          30
  7     8    70
  7     8   -70

6 row(s) retrieved
25 сен 07, 13:17    [4711272]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
Правда DISTINCT раздражает ...

select a
     , b
     , CASE
          WHEN b is not null and rn = 2 then
           -amt
          else
           amt
       end amt
 from tab
    , (select rownum rn from all_tables where rownum <= 2)
where rn(+)/rn(+) = b/nullif(b,0)
 order by a, b, amt desc
/

         A          B        AMT
---------- ---------- ----------
         1          2         50
         1          2        -50
         3                    40
         5                    30
         7          8         70
         7          8        -70

6 rows selected

SQL> 
25 сен 07, 13:26    [4711341]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
SQL> with tab as (
  2    select 1 a,2 b,50 amt from dual
  3    union
  4    select 3 a,null b,40 amt  from dual
  5    union
  6    select 5 a,null b,30 amt  from dual
  7    union
  8    select 7 a,8 b,70 amt  from dual
  9  )
 10  select a, b, decode(rn,2,-amt,amt) amt from tab, 
 11  (select rownum rn from all_objects where rownum <=2) t
 12  where sign(abs(tab.b)) = sign(t.rn(+))
 13  order by 1,2,3 desc
 14  /

         A          B        AMT
---------- ---------- ----------
         1          2         50
         1          2        -50
         3                    40
         5                    30
         7          8         70
         7          8        -70

6 rows selected.
25 сен 07, 13:27    [4711343]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
andrey_anonymous
dmidek
Правда DISTINCT раздражает ...

where rn(+)/rn(+) = b/nullif(b,0)

Сорри, не то скопипастил :)
where rn(+) <> 0*b
25 сен 07, 13:28    [4711356]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Никодим 2
Guest
Всем большое спасибо,
субъективно, "красивее" всего ответ от andrey_anonymous.
25 сен 07, 13:42    [4711477]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
Никодим 2
Всем большое спасибо,
субъективно, "красивее" всего ответ от andrey_anonymous.

Эстетики хочется?
select min(a) a, min(b) b
     , decode(grouping_id(rownum),0,1,1,-1)*sum(amt) amt
from tab
group by grouping sets((rownum),(rownum+1))
having sum(b) is not null or grouping_id(rownum)=0
order by 1,2,3 desc
;

         A          B        AMT
---------- ---------- ----------
         1          2         50
         1          2        -50
         3                    40
         5                    30
         7          8         70
         7          8        -70

6 rows selected
25 сен 07, 13:50    [4711546]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
andrey_anonymous
Никодим 2
Всем большое спасибо,
субъективно, "красивее" всего ответ от andrey_anonymous.

Эстетики хочется?


А еще хочется ? :-)

ANSI- JOIN рулит ...

SQL>  with tab as (
  2      select 1 a,2 b,50 amt from dual
  3      union
  4      select 3 a,null b,40 amt  from dual
  5      union
  6      select 5 a,null b,30 amt  from dual
  7      union
  8      select 7 a,8 b,70 amt  from dual
  9      )
 10     select  a,
 11                     b,
 12                     CASE
 13                       WHEN b is not null and rn = 2 then
 14                        -amt
 15                       else
 16                        amt
 17                     end amt
 18       from tab left join (select rownum rn from all_tables where rownum <= 2)
 19       ON tab.b is not null
 20      order by a, b, amt desc
 21  /
 
         A          B        AMT
---------- ---------- ----------
         1          2         50
         1          2        -50
         3                    40
         5                    30
         7          8         70
         7          8        -70
 
6 rows selected
 
SQL> 
25 сен 07, 13:56    [4711600]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
andrey_anonymous
Никодим 2
Всем большое спасибо,
субъективно, "красивее" всего ответ от andrey_anonymous.

Эстетики хочется?
А еще хочется ? :-)


Вот из принципа не буду приводить model-вариант
25 сен 07, 14:00    [4711643]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Никодим 2
Guest
эх, господа, много у вас свободного времени :)

select a, b, amt * t.f
from tab, (select 1 f from dual union select -1 from dual) t
where t.f > 0 or b is not null
25 сен 07, 14:01    [4711656]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
ГостЪ
Guest
andrey_anonymous
dmidek
andrey_anonymous
Никодим 2
Всем большое спасибо,
субъективно, "красивее" всего ответ от andrey_anonymous.

Эстетики хочется?
А еще хочется ? :-)


Вот из принципа не буду приводить model-вариант


ну и ладно:)
 with tab as (
     select 1 a,2 b,50 amt from dual
     union
     select 3 a,null b,40 amt  from dual
     union
     select 5 a,null b,30 amt  from dual
     union
     select 7 a,8 b,70 amt  from dual
   )
   
select  a,  b, amt
  from tab
model 
dimension by (a,b,1 z)
measures (amt)
rules upsert all 
(amt[any,b is not null ,2] = -amt[cv(),cv(),1])
25 сен 07, 14:19    [4711820]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
Никодим 2
эх, господа, много у вас свободного времени :)

select a, b, amt * t.f
from tab, (select 1 f from dual [b]union[/b] select -1 from dual) t
where t.f > 0 or b is not null


А кто просил без union ?
25 сен 07, 14:21    [4711837]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
Дубовая голова
Никодим 2
эх, господа, много у вас свободного времени :)

select a, b, amt * t.f
from tab, (select 1 f from dual [b]union[/b] select -1 from dual) t
where t.f > 0 or b is not null


А кто просил без union ?

Да ладно Вам, красивый же вариант.
select a, b, amt * t.f
from tab, (select decode(rownum,1,1,-1) f from dual connect by level < 3) t
where t.f > 0 or b is not null
25 сен 07, 14:23    [4711854]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
ГостЪ
andrey_anonymous
dmidek
andrey_anonymous
Никодим 2
Всем большое спасибо,
субъективно, "красивее" всего ответ от andrey_anonymous.

Эстетики хочется?
А еще хочется ? :-)
Вот из принципа не буду приводить model-вариант

ну и ладно:)

Я крут и толст - принцип заключался в том, что у меня под рукой ни одной десятки
25 сен 07, 14:24    [4711873]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
andrey_anonymous
Да ладно Вам, красивый же вариант.


Это так, в порядке шутки :) Вариант действительно красивый.
25 сен 07, 14:25    [4711881]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
andrey_anonymous
ГостЪ
andrey_anonymous
dmidek
andrey_anonymous
Никодим 2
Всем большое спасибо,
субъективно, "красивее" всего ответ от andrey_anonymous.

Эстетики хочется?
А еще хочется ? :-)
Вот из принципа не буду приводить model-вариант

ну и ладно:)

Я крут и толст - принцип заключался в том, что у меня под рукой ни одной десятки

По выходным от меня тоже MODEL- решений не дождетесь - APEX их не поддерживает

ИМХО
А вообще - то очень неплохой brainstorming получился ...
25 сен 07, 14:28    [4711911]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
По выходным от меня тоже MODEL- решений не дождетесь - APEX их не поддерживает

Помню, Вы как-то делились линком... Потребовалось как-то - не нашел :(
А вообще дома можно мааааленький такой оракель и на буке разводить... ;)
25 сен 07, 14:31    [4711936]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116299
andrey_anonymous
dmidek
По выходным от меня тоже MODEL- решений не дождетесь - APEX их не поддерживает

Помню, Вы как-то делились линком... Потребовалось как-то - не нашел :(


Вы имеете в виду apex.oracle.com ?
Плиз ....
Только надо там зарегистрироваться. А вопрос про цель - написать например "test"
Они дают Workspace

andrey_anonymous
А вообще дома можно мааааленький такой оракель и на буке разводить... ;)


Не могу. Тогда жена точно убьет
25 сен 07, 14:34    [4711963]     Ответить | Цитировать Сообщить модератору
 Re: oracle sql задача  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18388
dmidek
apex.oracle.com

thnks!
25 сен 07, 14:45    [4712057]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: oracle sql задача  [new]
va/
Guest
насколько способ GROUP BY GROUPING SETS предпочтительнее чем картезиан-джойн с PIVOT?
27 сен 08, 00:57    [6235323]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить