Сумма и объединенные данные столбца в одном запросе - PullRequest
2 голосов
/ 27 мая 2019

Я использую Oracle DB, и у меня следующий запрос, который выдает ошибку:

ORA-00937: нет функции для одной группы

Запрос:

select sum(ct.TOT_CT), ct.CREAT_TS, ev.EVENT
    from REF_CT ct
    inner join EVENT ev on ev.EVENT_TYPE_ID = ct.EVENT_TYPE_ID
    where ct.TX = 'SomeText';

Если я пытаюсь получить доступ к следующему по отдельности, это работает.Как и при вызове sum отдельно, ct.CREAT_TS отдельно и т. Д.

Кажется, проблема в вызове sum в этом запросе.Я планирую захватить вывод в объекте (Java, если уместно).Я ожидал, что запрос выведет следующее.Можно ли этого добиться?

CREAT_TS                      EVENT          sum(ct.TOT_CT)
2019-04-02 01:33:46.227000    SOME_EVENT 1   8
2019-04-02 02:56:14.530000    SOME_EVENT 2

После получения ответов, получение следующих результатов, в которых значение суммы делится на столбец:

CREAT_TS                      EVENT          sum(ct.TOT_CT)
2019-04-02 01:33:46.227000    SOME_EVENT 1   2
2019-04-02 02:56:14.530000    SOME_EVENT 2   6

Ответы [ 3 ]

1 голос
/ 27 мая 2019

Если хотя бы один агрегированный столбец существует в списке выбора, необходимо сгруппировать по неагрегированным столбцам

select sum(ct.TOT_CT), ct.CREAT_TS, ev.EVENT
    from REF_CT ct
    inner join EVENT ev on ev.EVENT_TYPE_ID = ct.EVENT_TYPE_ID
    where ct.TX = 'SomeText'
    group by ct.CREAT_TS, ev.EVENT
1 голос
/ 27 мая 2019

Вы можете использовать оконные функции, чтобы поместить общую сумму в каждую строку:

select ev.EVENT, ct.CREAT_TS, sum(ct.TOT_CT), 
       sum(sum(ct.TOT_CT)) over ()
from REF_CT ct inner join
     EVENT ev
     on ev.EVENT_TYPE_ID = ct.EVENT_TYPE_ID
where ct.TX = 'SomeText'
group by ev.EVENT, ct.CREAT_TS;

Я не рекомендую помещать значение только в одну строку, но вы можете сделать это с помощью оконных функций:

select ev.EVENT, ct.CREAT_TS, sum(ct.TOT_CT), 
       (case when 1 = row_number() over (partition by ev.event order by ct.CREAT_TS)
             then sum(sum(ct.TOT_CT)) over ()
        end)
from REF_CT ct inner join
     EVENT ev
     on ev.EVENT_TYPE_ID = ct.EVENT_TYPE_ID
where ct.TX = 'SomeText'
group by ev.EVENT, ct.CREAT_TS
order by ev.EVENT, ct.CREAT_TS;

Значение order by очень важно, если вы хотите, чтобы общий итог в первой строке определялся как CREAT_TS.

1 голос
/ 27 мая 2019

Вы должны включить group by предложение.

select sum(ct.TOT_CT), ct.CREAT_TS, ev.EVENT
    from REF_CT ct
    inner join EVENT ev on ev.EVENT_TYPE_ID = ct.EVENT_TYPE_ID
    where ct.TX = 'SomeText'
    group by ct.CREAT_TS, ev.EVENT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...