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

Откуда:
Сообщений: 1993
есть набор
1 - 11
2 - 21
2 - 22
3 - 31
3 - 32
надо получить без model:
11-21-31
11-22-31
11-21-32
11-22-32

спасибо

Сообщение было отредактировано: 25 мар 20, 19:36
25 мар 20, 19:28    [22105919]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9819
with t as (
           select 1 id,11 val from dual union all
           select 2,21 from dual union all
           select 2,22 from dual union all
           select 3,31 from dual union all
           select 3,32 from dual
          ),
     x as (
           select  t.*,
                   row_number() over(partition by id order by val) rn
             from  t
          )
select  last_value(val1 ignore nulls) over(order by rn) val1,
        last_value(val2 ignore nulls) over(order by rn) val2,
        last_value(val3 ignore nulls) over(order by rn) val3
  from  x
  pivot(
        max(val)
        for id in (1 val1,2 val2,3 val3)
       )
/

      VAL1       VAL2       VAL3
---------- ---------- ----------
        11         21         31
        11         22         32

SQL>


SY.
25 мар 20, 20:27    [22105954]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8479
Автор же вроде хочет обычное декартово произведение. В чем проблема - мне не понятно

Возможно туплю и не понял автора.

with t as (
           select 1 id,11 val from dual union all
           select 2,21 from dual union all
           select 2,22 from dual union all
           select 3,31 from dual union all
           select 3,32 from dual
          )
select a.val, b.val, c.val from (select val from t where id=1) a,
(select val from t where id=2) b,
(select val from t where id=3) c
25 мар 20, 20:34    [22105959]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
Алекссс
Member

Откуда:
Сообщений: 1993
спасибо за подсказки
Leonid Kudryavtsev, да, декартово, только мы заранее не знаем сколько будет строк в группах и сколько самих групп, думал может возможно сделать статическим sql
25 мар 20, 21:46    [22105981]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
Алекссс
Member

Откуда:
Сообщений: 1993
SY, не хватает еще 2-х строк)
25 мар 20, 21:48    [22105982]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
xtender
Member

Откуда: Мск
Сообщений: 5370
Алекссс,

with t as (
           select 1 id,11 val from dual union all
           select 2,21 from dual union all
           select 2,22 from dual union all
           select 3,31 from dual union all
           select 3,32 from dual
          )
select
 sys_connect_by_path(val,'-') x
from t
start with id=1
connect by id = prior id +1
order by level desc
fetch first 1 rows with ties
25 мар 20, 21:56    [22105987]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
xtender
Member

Откуда: Мск
Сообщений: 5370
SQL> ;
  1  with t as (
  2             select 1 id,11 val from dual union all
  3             select 2,21 from dual union all
  4             select 2,22 from dual union all
  5             select 3,31 from dual union all
  6             select 3,32 from dual
  7            )
  8  select
  9   ltrim(sys_connect_by_path(val,'-'),'-') x
 10  from t
 11  start with id=1
 12  connect by id = prior id +1
 13  order by level desc
 14  fetch first 1 rows with ties
 15*
SQL> /

X
--------------------------------------------------------------------------------
11-21-31
11-21-32
11-22-31
11-22-32
25 мар 20, 21:57    [22105989]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
Алекссс
Member

Откуда:
Сообщений: 1993
xtender, круть!
а в SQL:2008 могешь?)
25 мар 20, 22:21    [22105994]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53778
Алекссс
xtender, круть!
а в SQL:2008 могешь?)
на скорую руку за 5 минут
+
;
 with t as (
            select 1 id,11 val union all
            select 2,21 union all
            select 2,22 union all
            select 3,31 union all
            select 3,32 
           ),
tt as(
select id,
       cast(val as varchar(8000)) val
  from t where id=1
union all
select t.id,
       tt.val + ' - ' + cast(t.val as varchar(8000))
  from t join tt
   on t.id = tt.id+1
)
select * from tt
 where not exists(select * from tt tt1 where tt1.val like tt.val + '%' and tt1.val > tt.val)
26 мар 20, 09:39    [22106132]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53778
только есть ли там рекурсия?
26 мар 20, 09:39    [22106134]     Ответить | Цитировать Сообщить модератору
 Re: sql задачка  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
andreymx
только есть ли там рекурсия?
Recursive CTE доступно в MS SQL Server, начиная с версии 2005.

Сообщение было отредактировано: 27 мар 20, 04:37
27 мар 20, 04:37    [22106661]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить