Мне нужно узнать, какой автор продал больше всего книг и сколько книг продал автор.

select a.firstname ||''|| a.lastname as fullname,
       max(count(datesold))
from   author a,
       transaction t,
       book b
where  a.authorid = b.authorid
and    b.bookid = t.bookid
group by
       a.firstname,
       a.lastname;

Это дало мне ошибку not a single-group group function.

Есть идеи, в чем проблема?

0
brian 26 Янв 2022 в 13:27
Пожалуйста, добавьте образцы данных для всех трех таблиц. Вам нужно только добавить достаточно данных для минимального примера.
 – 
Tim Biegeleisen
26 Янв 2022 в 13:28
Вы не можете вкладывать агрегатные функции, если в списке select есть неагрегированные столбцы.
 – 
astentx
26 Янв 2022 в 14:43

1 ответ

С некоторыми примерами данных

SQL> with
  2  author (authorid, firstname, lastname) as
  3    (select 1, 'Stephen', 'King'  from dual union all
  4     select 2, 'Jo'     , 'Nesbo' from dual),
  5  book (bookid, authorid) as
  6    (select 100, 1 from dual union all
  7     select 200, 1 from dual union all
  8     select 300, 2 from dual
  9    ),
 10  transaction (trans_id, bookid) as
 11    (select 1, 100 from dual union all
 12     select 2, 100 from dual union all
 13     select 3, 100 from dual union all
 14     select 4, 300 from dual
 15    ),

Запрос использует аналитическую функцию RANK, которая ранжирует строки по количеству строк в таблице transaction (она показывает, сколько книг было продано). Наконец, выберите строки с высшим рейтингом:

 16  temp as
 17    (select a.firstname || ' ' || a.lastname AS fullname,
 18            count(t.bookid) cnt,
 19            rank() over (order by count(t.bookid) desc) rnk
 20     from author a join book b on a.authorid = b.authorid
 21                   join transaction t on t.bookid = b.bookid
 22     group by a.firstname, a.lastname
 23    )
 24  select fullname, cnt
 25  from temp
 26  where rnk = 1;

FULLNAME             CNT
------------- ----------
Stephen King           3

SQL>
0
Littlefoot 26 Янв 2022 в 13:37