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

Можно ли средствами 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
Результат запроса (столбец) разбить и вывести в N-столбцов
    #39607444
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Результат запроса (столбец) разбить и вывести в N-столбцов
    #39607492
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Результат запроса (столбец) разбить и вывести в N-столбцов
    #39607605
Alexander Warlord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!) думал как раз через mod() делать, только не особо получалось..
...
Рейтинг: 0 / 0
Результат запроса (столбец) разбить и вывести в N-столбцов
    #39607685
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Результат запроса (столбец) разбить и вывести в N-столбцов
    #39608020
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxинтересно, зачем сортировать? выборка ж упорядочена по по rownum


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

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

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

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

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

Staxпро RN понятно, я о over(order by rownum)
надеялся что будет без сорт (аля WINDOW BUFFER)
WINDOW BUFFER тут быть никак не может, потому что аналитическая сортировка выполняется первой. Поэтому тут чистый window sort. С другой стороны, логичнее было бы ожидать, что второй сортировки не будет. Хотя, кто его знает, может фактически на этом шаге она и не производится, а шаг оставлен в плане, чтобы показать, что оптимизатор не забыл, что данные должны быть выданы в порядке сортировки. И может быть в следующих версиях его (этот шаг) заменят каким-нибудь order by nosort.
...
Рейтинг: 0 / 0
Результат запроса (столбец) разбить и вывести в N-столбцов
    #39608079
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Результат запроса (столбец) разбить и вывести в N-столбцов
    #39608081
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

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

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

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

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


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