我有一个问题,数据库中每位作者平均出版多少本书?
图书类别的示例数据:
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行出现了错误。
答案 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计算所有作者的平均值。