Как реализовал сумму в иерархической консультации в SGBD Oracle?

У меня есть BD в oracle с персоналом, группируемым площадями. Когда я стараюсь получать суб-суммы персонала из-за площади посредством консультации

SELECT rpad( ' ', 1*level, '===' )
       ||
       case when  level> 1 then '>'
       else '+' end
       ||
       dept_name dept_name
      ,sum(employees)
      , employees
FROM dept
START WITH parent_id IS NULL
CONNECT BY PRIOR dept_id = parent_id;

я получаю следующую ошибку:

ORA-00937: not в single-group group function

Я присоединяю ссылку, если бы кто-то захотел помочь и не имел бы доступа к конфигурировавшей среде.

Ожидаемый вывод

------------------------------------------------
|          DEPT_NAME | EMPLOYEES |SUM EMPLOYEES|
|--------------------|-----------|-------------|
|  +IT               |       100 |          178|
|  =>DEVELOPMENT     |        12 |          30 |
|  ==>PL/SQL         |         2 |           2 |
|  ==>Java           |         1 |           2 |
|  ===>Dukescript    |         1 |           1 |
|  ==>SQL            |        11 |          11 |
|  ==>C++            |         3 |           3 |
|  =>SUPPORT         |        15 |          15 |
|  =>TEST            |        25 |          33 |
|  ==>Functional     |         3 |           3 |
|  ==>Non Functional |         5 |           5 |
------------------------------------------------

Продвижения

Не определяя уровня я получаю дублированное дерево

select dept_name, employees, tot_employees 
from (select 
           employees,
           rpad( ' ', 1*level, '===' )
       ||
       case when  level> 1 then '>'
       else '+' end
       ||
       dept_name dept_name,
           level lev,
           sum(employees) over(partition by connect_by_root
                                           (dept_id)
                               ) tot_employees
      from dept
    connect by prior dept_id = parent_id)
    ;

но используя

select dept_name, employees, tot_employees 
from (select 
           employees,
           rpad( ' ', 1*level, '===' )
       ||
       case when  level> 1 then '>'
       else '+' end
       ||
       dept_name dept_name,
           level lev,
           sum(employees) over(partition by connect_by_root
                                           (dept_id)
                               ) tot_employees
      from dept
    connect by prior dept_id = parent_id)
    where lev=1;

разрушается дерево, которое он печатал.

Спасибо заранее.

3
задан 28.12.2015, 21:35
2 ответа

Этот ответ - приближение к желанному решению:

SELECT PARENT, DEPT_NAME, SUM(employees)
FROM (
    SELECT CASE PARENT_ID WHEN 1 THEN DEPT_ID
       ELSE PARENT_ID END PARENT,
       rpad( ' ', 1*level, '===' )
       ||
       case when  level> 1 then '>'
       else '+' end
       ||
       dept_name dept_name      
      ,EMPLOYEES
    FROM dept
    START WITH parent_id is null
    CONNECT BY PRIOR dept_id = parent_id)
GROUP BY ROLLUP(PARENT, dept_name)
ORDER BY PARENT, dept_name;

Ключ - использование субстатьи GROUP BY названного ROLLUP, которая производит субдобавки, которые в этом случае субполные для каждой из площадей, которые появляются в конце каждой.

Деталь состоит в том, что группирование не группирует правильно площади, которые находятся в уровне, превосходящем два, например Dukescript не будь распределен в DEVELOPMENT а в Java. CASE WHEN я это использую для того, чтобы главные площади также были единичными. Я надеюсь, что это может давать тебе идею, и изменяя консультацию смоги прибывать в правильное решение.

2
ответ дан 24.11.2019, 15:02
  • 1
    Что умный с твоей стороны помещать продвижение: D Muchas gracias это проверять и # 233; спокойно:) –  Ruslan López 28.12.2015, 21:39

Я не знаю синтаксис Oracle в особенности, но в SQL, чтобы мочь использовать функцию добавления, ты должен группировать из-за полей, которые не в функции (GROUP BY).

Ты можешь видеть например здесь, что он объясняет, как использовать GROUP BY в Oracle.

Так или иначе, помещать sum(employees) и employees в той же консультации я не думаю, что у него есть эффект, который ты хочешь, тебе будешь неважным в двух колоннах. Ты был бы должен делать "sub-query", который возвращал бы тебе сумму персонала ведомств, которые являются детьми настоящего...

0
ответ дан 24.11.2019, 15:02
  • 1
    К несчастью не говорится о простой консультации с funci и # 243; n agrupaci и # 243; n, говорится о передовой консультации, (jer и # 225; rquica), я увидел консультации jer и # 225; rquicas в нескольких драйверах, не и #250; nicamente в Oracle. Я буду иметь мои продвижения, сумма не идет так плохо..., но и #225; rbol он был разрушен: ( –  Ruslan López 28.12.2015, 21:31
  • 2
    @RuslanL и # 243; pezCarro, консультации jer и # 225; rquicas они не " oficiales" seg и # 250; n стандарт SQL, они свойственные разработчику (в этом случае Oracle). DB2 у него есть они tambi и # 233; n, но mysql не. С этого времени, поведение, которое должно встречаться с funci и # 243; n GROUP BY зависит от того, что было сделано. И я боюсь, что в этом случае у него есть Рамы raz и # 243; n. Хотя я распознаю, что утилита funci и # 243; n она очень высокая. –  Raul Luna 30.12.2015, 02:34
  • 3
    @RaulLuna действительно, что существуют в mysql: sqlfiddle.com/#!2/74fc16/27 –  Ruslan López 30.12.2015, 03:58
  • 4
    И существуй в ANSI SQL с 1992 посредством full outer joins: advancedhierarchicalprocessing.ulitzer.com/node/1764314 auqnue в ANSI SQL 1999 выносили консультации jer и # 225; rquicas, чтобы предоставлять привилегии dbis-informatik.uibk.ac.at/files/ext/lehre/ss11/vo-ndbm/lit / и hellip; –  Ruslan López 30.12.2015, 04:01

Теги

Похожие вопросы