SQL ORA-00937: не ошибка функции групповой группы - PullRequest
1 голос
/ 11 мая 2019

Я изо всех сил пытаюсь понять, почему Oracle не позволяет мне выполнить это, и выдает ошибку «ORA-00937: не функция одной группы». У меня есть GROUP BY и единственный столбец, который должен быть в нем. Может я неправильно сделал запрос? Помогите? Заранее спасибо

Отображение названия компании и объема торгов для компании, акции которой имеют наибольший общий объем торгов акционеров во всем мире.

SELECT MAX(COUNT(trade.shares)) AS "Max Count of Company Stock",
       company.name
FROM   trade
       JOIN company
            ON  company.stock_id = trade.stock_id
GROUP BY company.name;

Ответы [ 2 ]

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

Если я понимаю, что вы пытаетесь достичь, вас должно получить следующее:

WITH cteCompany_shares AS (SELECT c.NAME, SUM(t.SHARES) AS SHARES_TRADED
                             FROM COMPANY c
                             INNER JOIN TRADE t
                               ON t.STOCK_ID = c.STOCK_ID
                             GROUP BY c.NAME)
SELECT cs.NAME, cs.SHARES_TRADED
  FROM cteCompany_shares cs
  WHERE cs.SHARES_TRADED = (SELECT MAX(SHARES_TRADED)
                              FROM cteCompany_shares);
0 голосов
/ 11 мая 2019

Прежде всего, я думаю, что вы хотите sum акций, а не count их.

Проблема в том, что ваш запрос пытается выполнить два уровня агрегации одновременно (сначала посчитайте / суммируйте доли, затем возьмите максимум этого), что невозможно.

Попробуйте это:

select c.name
     , count(t.shares) as "Number of trades"
     , sum(t.shares) as "Trade volume"
from   trade t
       join company c on c.stock_id = t.stock_id
group by c.name
order by sum(t.shares) desc
fetch first row only;

(Для условия fetch first требуется Oracle 12.1 или более поздняя версия.)

Или это:

select name, total_shares
from   ( select c.name
              , sum(t.shares) as total_shares
              , rank() over (order by sum(t.shares) desc) as ranking
         from   trade t
                join company c on c.stock_id = t.stock_id
         group by c.name )
where  ranking = 1;

Пример данных:

create table company
( stock_id  number primary key
, name      varchar2(30) not null );

create table trade
( stock_id  references company
, shares    number not null );

insert all
    into company values (1, 'Apple')
    into company values (2, 'Microsoft')
    into company values (3, 'Oracle')
    into company values (4, 'Huawei')
    into company values (5, 'Robertson Solutions')
select * from dual;

insert all
    into trade values (1,  10)
    into trade values (2,   5)
    into trade values (3, 100)
    into trade values (4, 200)
    into trade values (5,   5)
    into trade values (1,  20)
    into trade values (2,  30)
    into trade values (3,  40)
    into trade values (4,  50)
    into trade values (5,  20)
    into trade values (1,  70)
select * from dual;

Сводные данные:

select c.name
     , sum(t.shares) as total_shares
     , rank() over (order by sum(t.shares) desc) as ranking
from   trade t
       join company c  on  c.stock_id = t.stock_id
group by c.name
order by total_shares desc;

NAME                 TOTAL_SHARES    RANKING
-------------------- ------------ ----------
Huawei                        250          1
Oracle                        140          2
Apple                         100          3
Microsoft                      35          4
Robertson Solutions            25          5
...