Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Результат запроса (столбец) разбить и вывести в N-столбцов / 14 сообщений из 14, страница 1 из 1
26.02.2018, 18:02
    #39607436
Alexander Warlord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Приветствую форумчан!

Можно ли средствами SQL сразу вывести результат запроса в несколько N-столбцов?
Возможно исходя из количества записей..

Результат:

NUMBERS
7312312
7314314
7318318
7319319
7324324
7326326
7329329
7330233
7331833
7331933
7332133
7332433
7332633
7332833
7334133
7334533
7334633
7334833

Нужно получить:

NUMBERS NUMBERS NUMBERS NUMBERS
7312312 7326326 7332133 7334133
7314314 7329329 7332433 7334533
7318318 7330233 7332633 7334633
7319319 7331833 7332833 7334833
7324324 7331933

Результат самого простого запроса:

Код: plsql
1.
2.
3.
4.
SELECT
    ph.NOMERA AS NOMERA
FROM
    NUMBERS ph
...
Рейтинг: 0 / 0
26.02.2018, 18:12
    #39607444
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with t as (
           select  empno e1,
                   lead(empno) over(order by rownum) e2,
                   lead(empno,2) over(order by rownum) e3,
                   lead(empno,3) over(order by rownum) e4,
                   rownum rn
             from  emp
          )
select  e1,
        e2,
        e3,
        e4
  from  t
  where mod(rn,4) = 1
  order by rn
/

        E1         E2         E3         E4
---------- ---------- ---------- ----------
      7369       7499       7521       7566
      7654       7698       7782       7788
      7839       7844       7876       7900
      7902       7934

SQL> 



SY.
...
Рейтинг: 0 / 0
26.02.2018, 18:58
    #39607492
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Alexander Warlord,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select e1,e2,e3,e4 from
  2   (select empno, mod(rownum-1,4) c, trunc((rownum-1)/4) r from emp)
  3  pivot (max(empno) for c in (0 as e1,1 as e2, 2 as e3,3 as e4))
  4  order by r
  5  /

      E1       E2       E3       E4
-------- -------- -------- --------
    7369     7499     7521     7566
    7654     7698     7782     7788
    7839     7844     7876     7900
    7902     7934




....
stax
...
Рейтинг: 0 / 0
27.02.2018, 08:49
    #39607605
Alexander Warlord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Спасибо!) думал как раз через mod() делать, только не особо получалось..
...
Рейтинг: 0 / 0
27.02.2018, 10:46
    #39607685
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
SY,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Execution Plan
----------------------------------------------------------
Plan hash value: 773907260

------------------------------------------------------------------------------
| Id  | Operation             | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |      |    14 |   910 |     5  (40)| 00:00:01 |
|   1 |  SORT ORDER BY        |      |    14 |   910 |     5  (40)| 00:00:01 |
|*  2 |   VIEW                |      |    14 |   910 |     4  (25)| 00:00:01 |
|   3 |    WINDOW SORT        |      |    14 |    56 |     4  (25)| 00:00:01 |
|   4 |     COUNT             |      |       |       |            |          |
|   5 |      TABLE ACCESS FULL| EMP  |    14 |    56 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):


интересно, зачем сортировать? выборка ж упорядочена по по rownum


....
stax
...
Рейтинг: 0 / 0
27.02.2018, 17:45
    #39608020
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Staxинтересно, зачем сортировать? выборка ж упорядочена по по rownum


RN это ROWNUM в CTE a не в main query. И я понятия не имею как оптимизатор будет выполнять main query - вдруг парaллельно? Посему пишу ORDER BY RN. А почему оптимизатор не просек WINDOW SORT - это к Larry :)

SY.
...
Рейтинг: 0 / 0
27.02.2018, 17:49
    #39608024
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Хотя под WINDOW SORT скрывается и вычисление LEAD, поэтому трудно сказать а был ли мальчик SORT или нет.

SY.
...
Рейтинг: 0 / 0
27.02.2018, 18:10
    #39608046
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
SY,

про RN понятно, я о over(order by rownum)
надеялся что будет без сорт (аля WINDOW BUFFER)

.....
stax
...
Рейтинг: 0 / 0
27.02.2018, 18:47
    #39608071
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
SYХотя под WINDOW SORT скрывается и вычисление LEAD, поэтому трудно сказать а был ли мальчик SORT или нет.Ну а как иначе посчитать lead? Без сортировки-то. Все остальные варианты выглядят притянутыми за уши.

Staxпро RN понятно, я о over(order by rownum)
надеялся что будет без сорт (аля WINDOW BUFFER)
WINDOW BUFFER тут быть никак не может, потому что аналитическая сортировка выполняется первой. Поэтому тут чистый window sort. С другой стороны, логичнее было бы ожидать, что второй сортировки не будет. Хотя, кто его знает, может фактически на этом шаге она и не производится, а шаг оставлен в плане, чтобы показать, что оптимизатор не забыл, что данные должны быть выданы в порядке сортировки. И может быть в следующих версиях его (этот шаг) заменят каким-нибудь order by nosort.
...
Рейтинг: 0 / 0
27.02.2018, 18:56
    #39608079
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
AmKadSYХотя под WINDOW SORT скрывается и вычисление LEAD, поэтому трудно сказать а был ли мальчик SORT или нет.Ну а как иначе посчитать lead? Без сортировки-то. Все остальные варианты выглядят притянутыми за уши.

Staxпро RN понятно, я о over(order by rownum)
надеялся что будет без сорт (аля WINDOW BUFFER)
WINDOW BUFFER тут быть никак не может , потому что аналитическая сортировка выполняется первой. Поэтому тут чистый window sort. С другой стороны, логичнее было бы ожидать, что второй сортировки не будет. Хотя, кто его знает, может фактически на этом шаге она и не производится, а шаг оставлен в плане, чтобы показать, что оптимизатор не забыл, что данные должны быть выданы в порядке сортировки. И может быть в следующих версиях его (этот шаг) заменят каким-нибудь order by nosort.

про вторую у меня вопросов нет

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
  1  select empno
  2  ,lead(empno) over (order by empno) le
  3*  from emp where EMPNO>7369
SQL> /

   EMPNO       LE
-------- --------
    7499     7521
    7521     7566
    7566     7654
    7654     7698
    7698     7782
    7782     7788
    7788     7839
    7839     7844
    7844     7876
    7876     7900
    7900     7902
    7902     7934
    7934

13 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 4166611438

---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |    13 |    52 |     1   (0)| 00:00:01 |
|   1 |  WINDOW BUFFER    |             |    13 |    52 |     1   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN| I$EMP$ENPNO |    13 |    52 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMPNO">7369)

SQL> set autotrace off



нет сортировки для LEAD

ююююю
stax
...
Рейтинг: 0 / 0
27.02.2018, 18:59
    #39608081
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Stax,

Согласен.
...
Рейтинг: 0 / 0
27.02.2018, 21:07
    #39608154
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
AmKadНу а как иначе посчитать lead? Без сортировки-то.

В общем случае - никак. А вот в дaнном случае с ORDER BY ROWNUM или ORDER BY 1 сортировaть незачем.
Просто с ORDER BY 1 оптимизатор знает что сортировка по литералу бессмысленна а вот ROWNUM к нему попадает как "тип переменная" и посему похoже он cортирует. C ORDER BY 1:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL> explain plan for
  2  select lead(sal) over(order by 1)
  3    from emp
  4  /

Explained.

SQL> select * from table(dbms_xplan.display)
  2  /

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
Plan hash value: 1066788578

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |    56 |     3   (0)| 00:00:01 |
|   1 |  WINDOW BUFFER     |      |    14 |    56 |     3   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| EMP  |    14 |    56 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
27.02.2018, 21:19
    #39608159
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
Кстати, если испoльзовть ORDER BY 1, то сортировки не будет и получим в порядке ROWNUM. Тут с точки зрения результата в принципе неважно сортируется/не сортируется, главное чтобы для всех LEAD выполнялось одинаково.

SY.
...
Рейтинг: 0 / 0
28.02.2018, 09:52
    #39608303
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса (столбец) разбить и вывести в N-столбцов
SYКстати, если испoльзовть ORDER BY 1, то сортировки не будет и получим в порядке ROWNUM. Тут с точки зрения результата в принципе неважно сортируется/не сортируется, главное чтобы для всех LEAD выполнялось одинаково.

SY.
c 1 хз как оно там сложится, а от с rownum гарантировано должно быть одинаково

.....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Результат запроса (столбец) разбить и вывести в N-столбцов / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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