在子查询中出现此错误:ORA-00934:此处不允许使用组功能

时间:2019-02-09 22:59:09

标签: sql oracle

我有一个问题,数据库中每位作者平均出版多少本书?

图书类别的示例数据:

TITLE                           CATEGORY
------------------------------ ------------
BODYBUILD IN 10 MINUTES A DAY  FITNESS
REVENGE OF MICKEY              FAMILY LIFE
BUILDING A CAR WITH TOOTHPICKS CHILDREN
DATABASE IMPLEMENTATION        COMPUTER
COOKING WITH MUSHROOMS         COOKING
HOLY GRAIL OF ORACLE           COMPUTER

我正在使用此命令:

select a.lname, a.fname, count(*) "# of Books"
from books b join bookauthor ba using (isbn)
join author a using (authorid)
group by fname, lname;

这只是我所有书的总数,但我还想要所有作者的平均书数,因此,我尝试使用AVG子查询。

我当前的代码是:

select lname, fname, count(*)
from books 
join bookauthor using (isbn)
join author using (authorid)
where count(*) = (
    select avg(count(*))
    from books
)
group by lname, fname;

我的预期结果是获得每位作者的平均图书出版商数量,但相反,我在第4行出现了错误。

5 个答案:

答案 0 :(得分:1)

您可以将现有查询移至子查询,并使用窗口函数AVG(...) OVER()计算每位作者的总体平均水平。

select 
    t.lname, t.fname, t.cnt "# of Books", avg(t.cnt) over() "Avg # of Books"
from (
    select lname, fname, count(*) cnt
    from books
    join bookauthor using (isbn)
    join author using (authorid)
    group by lname, fname, authorid
) t

NB:

  • 我建议在查询中的列前面加上适当的表别名。明确说明每一列的来源使查询更易于理解和维护。

  • authorid进行分组比使用全名更为安全,因为这样可以避免将具有相同全名的不同作者错误地分组在一起。

答案 1 :(得分:0)

如果没有子查询,可以使用带有窗口功能avg的一个查询来完成。

select lname, fname, count(*) as "# of Books",avg(count(*)) over() as avg_#_books
from books join bookauthor using (isbn)
join author using (authorid)
group by fname, lname

答案 2 :(得分:0)

每位作者出版的平均书籍数是一个数字。您可以通过以下方式获得它:

select count(*) / count(distinct b.authorid)
from bookauthor b;

如果您希望在每一行都加上计数:

select a.lname, a.fname, count(*) as num_books,
       avg(count(*)) over () as avg_for_all_authors
from bookauthor ba join
     author a
     using (authorid)
group by a.fname, a.lname

答案 3 :(得分:0)

您不能在其中使用过的where条件下使用诸如count(*)之类的组函数。在这种情况下,最简单的选择是使用“ having”子句。

从表中选择---,其中条件..按具有计数(*)=条件的列分组。

答案 4 :(得分:-1)

您可以在子查询中计算计数,然后在外部查询中添加平均值:

select  sub.*, avg("# of Books") over () as "Avg # Books Per Author"
from    (
        select lname, fname, count(*) "# of Books"
        from books join bookauthor using (isbn)
        join author using (authorid)
        group by fname, lname
        ) sub;

over ()窗口子句告诉Oracle计算所有作者的平均值。