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

Откуда:
Сообщений: 2142
Есть запрос:
                  SELECT DECODE(GROUPING(B.TNUM), 1, 'TOTAL MESTO_ID', B.TNUM) TNUM, 
                         DECODE(GROUPING(B.MESTO_ID), 1, 'TOTAL ALL', B.MESTO_ID) MESTO_ID, 
                         COUNT(B.TNUM) CNT
                         --, B.ROCK, B.KOP 
                  FROM 
                       (--Связь всех значимых таблиц
                         SELECT A.*, B.T_ID, D.*
                         FROM TF A, TRA_PR B, CAP_REP C, MESTO_U D
                         WHERE
                                A.DT1||A.TNUM = B.T_ID
                         AND  B.LINK_ID1 = C.LINK_ID2
                         AND  C.EXEC_ID = D.REP_ID
                        ) B
                  WHERE       
                      B.SM_MODE = 5
                  GROUP BY ROLLUP(B.MESTO_ID, B.TNUM)
Работает хорошо, но мне нужны некоторые дополнительные поля из запроса B.
Для этого:

SELECT TNUM, MESTO_ID, CNT, B.ROCK, B.KOP 
FROM (
                  SELECT DECODE(GROUPING(B.TNUM), 1, 'TOTAL MESTO_ID', B.TNUM) TNUM, 
                         DECODE(GROUPING(B.MESTO_ID), 1, 'TOTAL ALL', B.MESTO_ID) MESTO_ID, 
                         COUNT(B.TNUM) CNT
                         --, B.ROCK, B.KOP 
                  FROM 
                       (--Связь всех значимых таблиц
                         SELECT A.*, B.T_ID, D.*
                         FROM TF A, TRA_PR B, CAP_REP C, MESTO_U D
                         WHERE
                                A.DT1||A.TNUM = B.T_ID
                         AND  B.LINK_ID1 = C.LINK_ID2
                         AND  C.EXEC_ID = D.REP_ID
                        ) B
                  WHERE       
                      B.SM_MODE = 5
                  GROUP BY ROLLUP(B.MESTO_ID, B.TNUM)
         ) A,
                       (--Связь всех значимых таблиц
                         SELECT A.*, B.T_ID, D.*
                         FROM TF A, TRA_PR B, CAP_REP C, MESTO_U D
                         WHERE
                                A.DT1||A.TNUM = B.T_ID
                         AND  B.LINK_ID1 = C.LINK_ID2
                         AND  C.EXEC_ID = D.REP_ID
                        ) B
WHERE A.TNUM = B.TNUM(+)

Обращаться опять к запросу B для вытаскивания нужных полей, но я считаю, что это не оптимально.

Подскажите, может есть другой вариант...
9 авг 11, 13:39    [11091184]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
-2-
Member

Откуда:
Сообщений: 15330
kasik
Подскажите, может есть другой вариант...
Групповые функции.
9 авг 11, 13:43    [11091221]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
Я использую count и rollup или Вы не об этом?
9 авг 11, 13:44    [11091229]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
-2-
Member

Откуда:
Сообщений: 15330
kasik,

чего надо-то - обратно размножить строки или получить группировку по детали?
Для первого надо было сразу лезть в анал без групповухи, для второго использовать подходящую групповую функцию на требуемое поле, например max(поле) keep (dense_rank ...).
9 авг 11, 13:46    [11091250]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
Второй запрос это то что надо, только необходимо без дублирования запроса B, а совместить в одном запросе.

1-й запрос это группировка с промежуточными итогами, но тут же нужно указать дополнительную информацию по MESTO_ID и TNUM из запроса B. В данном запросе не удается указать эти поля, тк они не входят в группировку, поэтому имеем:
ORA-00979: not a GROUP BY expression
Из за этого приходится повторно использовать запрос B для нахождения необходимой дополнительной информации(B.ROCK, B.KOP)
9 авг 11, 14:36    [11091645]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
AmKad
Member

Откуда:
Сообщений: 5222
kasik,

10142614
9 авг 11, 14:39    [11091672]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
kasik
Второй запрос это то что надо, только необходимо без дублирования запроса B, а совместить в одном запросе.

1-й запрос это группировка с промежуточными итогами, но тут же нужно указать дополнительную информацию по MESTO_ID и TNUM из запроса B. В данном запросе не удается указать эти поля, тк они не входят в группировку, поэтому имеем:
ORA-00979: not a GROUP BY expression
Из за этого приходится повторно использовать запрос B для нахождения необходимой дополнительной информации(B.ROCK, B.KOP)


тебя уже ответили , max(поле) keep (dense_rank ...). : 11091250
9 авг 11, 14:42    [11091710]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
Ramin
max(поле) keep (dense_rank ...). : 11091250


Я не понял как это использовать, если честно...

Вот что получается у меня:
                 SELECT B.TNUM, 
                         B.MESTO_ID, 
                         COUNT(B.MESTO_ID) OVER (PARTITION BY B.MESTO_ID ORDER BY B.MESTO_ID) CNT
                         , B.ROCK, B.KOP 
                  FROM 
                       (--Связь всех значимых таблиц
                         SELECT A.*, B.T_ID, D.*
                         FROM TF A, TRA_PR B, CAP_REP C, MESTO_U D
                         WHERE
                                A.DT1||A.TNUM = B.T_ID
                         AND  B.LINK_ID1 = C.LINK_ID2
                         AND  C.EXEC_ID = D.REP_ID
                        ) B
                  WHERE       
                      B.SM_MODE = 5

Теперь я могу получить любую дополнительную информацию (B.ROCK, B.KOP), но промежуточных результатов нет(подведение итогово по группе и в целом)

MESTO_IDTNUMCNTROCK
RR-20110801-1-1015201021
RR-20110801-1-1015200021
RR-20110801-1-11015203031
RR-20110801-1-11015202031
RR-20110801-1-11035603031


было с rollup:
MESTO_IDTNUMCNTROCK
RR-20110801-1-1015201011
RR-20110801-1-1015200011
RR-20110801-1-1TOTAL MESTO_ID2null
RR-20110801-1-11015203011
RR-20110801-1-11015202011
RR-20110801-1-11035603011
RR-20110801-1-11TOTAL MESTO_ID3null
TOTAL ALLTOTAL MESTO_ID5null


Извиняюсь, что сразу не дал всю информацию
9 авг 11, 15:18    [11092105]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
kasik,
ну используй нужную функцию группирование и все....
9 авг 11, 15:55    [11092416]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
дак как я могу ее использовать, если мне тогда необходимо убирать нужные поля - B.ROCK, B.KOP - в этом то и состоит проблема!
9 авг 11, 16:08    [11092549]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6725
Ramin
тебя уже ответили , max(поле) keep (dense_rank ...). : 11091250
9 авг 11, 16:25    [11092714]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
Чего надо описал уже подробно вроде! спрашивайте что не понятно.
а как прикрутить к моей ситуации max(поле) keep (dense_rank ...) я не понял, сделайте запрос с использованием на основе моих запросов.
9 авг 11, 16:31    [11092761]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6725
kasik,

Вылезайте уже из танка и начните думать.
SELECT DECODE(GROUPING(B.TNUM), 1, 'TOTAL MESTO_ID', B.TNUM) TNUM, 
       DECODE(GROUPING(B.MESTO_ID), 1, 'TOTAL ALL', B.MESTO_ID) MESTO_ID, 
       COUNT(B.TNUM) CNT
       MAX(B.ROCK) KEEP (DENSE_RANK FIRST ORDNUNG BY B.MESTO_ID) 
9 авг 11, 16:39    [11092821]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
Спасибо, как то не воспринял его должным образом, но вот здесь все вроде понятно
http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/functions45a.htm

Значит получается такая конструкция как раз для такой ситуации и сделана?
И получается сколько полей хочу добавить столько и конструкций
KEEP (DENSE_RANK FIRST ORDNUNG BY 
использовать?
9 авг 11, 17:06    [11093074]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
-2-
Member

Откуда:
Сообщений: 15330
kisak
Значит получается такая конструкция как раз для такой ситуации и сделана?
Доходчиво, что надо, ты объяснить не смог. Данных и результата не предоставил. Соответственно, что именно "получается", решать придется самому.
9 авг 11, 17:23    [11093255]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
stax..
Guest
kasik
Спасибо, как то не воспринял его должным образом, но вот здесь все вроде понятно
http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/functions45a.htm

Значит получается такая конструкция как раз для такой ситуации и сделана?
И получается сколько полей хочу добавить столько и конструкций
KEEP (DENSE_RANK FIRST ORDNUNG BY 
использовать?

если полей много (или условие кип сложное)
кипом мона взять ровд (id) строки , и по ровиду найти недостающие поля

....
stax
9 авг 11, 17:52    [11093439]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
с примером можно?

PS не только я мало примеров даю...
9 авг 11, 18:07    [11093547]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
stax..
Guest
kasik
с примером можно?

PS не только я мало примеров даю...

select e.*,ex.empno,ex.ename,ex.sal 
from (
  select deptno,job,sum(sal),count(*)
 ,MIN(e.rowid) KEEP (DENSE_RANK FIRST ORDER BY empno) r
  from emp e group by rollup(deptno,job)) e
,emp ex
where ex.rowid=e.r
/

ps
когда-то мне на етом форуме ОЧЕНЬ доходчиво о кип расказали (с тремя никами найти не могу)

pss
можна по старинке
через substr
https://www.sql.ru/forum/actualthread.aspx?bid=3&tid=563335&pg=-1&hl=keep+%ea%eb%fe%f7

.....
stax
9 авг 11, 18:25    [11093627]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
с rowid будет ли работать на подзапросе, состоящем из нескольких таблиц? rowid разве не к физ записи таблицы привязывается?

А так выходит такое же дублирование подзапроса, как во втором запросе моего первого поста.
9 авг 11, 18:59    [11093761]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
stax..
Guest
kasik
с rowid будет ли работать на подзапросе, состоящем из нескольких таблиц? rowid разве не к физ записи таблицы привязывается?

А так выходит такое же дублирование подзапроса, как во втором запросе моего первого поста.

вы ж знаете из какой (каких) табличек поля брать
доспуп по rowid-у (ид) намного быстрее Вашего подзапроса

я ето привел как ПРИМЕР

можите для каждого нужного дополнительного поля рисовать keep

ps
если данные очень специфичные то с помощью keep может быть трудно (невозможно?) получить поля с одной и той же записи
9 авг 11, 20:01    [11093906]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
Elic
Member

Откуда:
Сообщений: 29979
kasik
PS не только я мало примеров даю...
Мля. Вот вроде бы девочка уже не первый день замужем, а всё телится, другие, мол, тоже плохо дают.
Дура, тебе нужно решить вопрос или сопли поразмазывать? - RTFM
9 авг 11, 21:49    [11094263]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
stax..
Guest
stax..
ps
когда-то мне на етом форуме ОЧЕНЬ доходчиво о кип расказали (с тремя никами найти не могу)
.....
stax

во, нашел, оказывается я тогда был Stah (что более правильно )

https://www.sql.ru/forum/actualthread.aspx?bid=3&tid=163973#1356459

2 Stah

А чего там непонятного?

Есть три поля в таблице f1, f2, f3

Если мы группируем по f1, то можем отсортировать каждую группу
по полю f2 и выбрать максимальное/минимальное значение поля f3,
даже если f2 имеет неуникальные значения в пределах группы.

Пример:



.....
stax
10 авг 11, 09:30    [11095199]     Ответить | Цитировать Сообщить модератору
 Re: группировка, rollup ....  [new]
kasik
Member

Откуда:
Сообщений: 2142
Спасибо stax..
до такой старой темы конечно не докопался!
пока остановился на кипе, но потом при необходимости можно попробовать и руид!
10 авг 11, 10:35    [11095580]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить