好的,所以我对以下问题感到很困难。
表1:书虫数据库的模式。主键带下划线。有一些外键引用将表连接在一起;你可以利用天然连接来利用它们。
对于每个发布商,请显示发布商发布的出版商名称和每页图书的平均价格。这里每页的平均价格是指总价格除以该套帐簿的总页数;它不是(价格/页数)的平均值。按升序排列每页平均价格的结果。
Author(aid, alastname, afirstname, acountry, aborn, adied).
Book(bid, btitle, pid, bdate, bpages, bprice).
City(cid, cname, cstate, ccountry).
Publisher(pid, pname).
Author_Book(aid, bid).
Publisher_City(pid, cid).
到目前为止,我已经尝试过:
SELECT
pname,
bpages,
AVG(bprice)
FROM book NATURAL JOIN publisher
GROUP BY AVG(bpages) ASC;
并收到
错误:“asc”处或附近的语法错误 第3行:按平均分组(bpages)asc;
答案 0 :(得分:1)
您需要ORDER BY子句而不是GROUP BY来对记录进行排序。因此,请将您的查询更改为:
SELECT pname, AVG(bprice)
FROM book NATURAL JOIN publisher
GROUP by pname
ORDER BY AVG(bpages) ASC;
答案 1 :(得分:1)
你不能通过聚合分组,至少不是那样。也不要使用自然加入,这是一个不好的习惯,因为大多数时候你必须指定加入条件。这是你在教科书中看到但在现实生活中几乎从未见过的事情之一。
确定这样做,这是作业,所以我不想在没有解释的情况下给你答案,聚合函数(在这种情况下为总和)会影响组内列的所有值受where子句和连接条件的限制,所以除非你每行都要指定哪个列包含你要分组的值。在这种情况下,我们的群组是发布商名称,他们想知道每个发布商,每页的价格是多少。让我们为此制定快速选择声明:
select Pname as Publisher
, Sum(bpages) as PublishersTotalPages
, sum(bprice) as PublishersTotalPrice
, sum(bprice)/Sum(bpages) as PublishersPricePerPage
接下来我们必须确定从何处获取信息以及表格如何与彼此相关,我们将使用书籍作为基础(虽然由于左或右连接的性质,它不如你想象的那么重要)。我们知道book表中的列PID与Publisher表中的列PID之间存在外键关系:
From Book B
Join Publisher P on P.PID = B.PID
这就是所谓的显式连接,我们明确地说明了两个表中两列之间的等价性(如果它在where子句中完成则意味着等价)。这为我们提供了多对一的关系,因为每个出版商都出版了许多书。要看到刚刚运行以下内容:
select b.*, p.*
From Book B
Join Publisher P on P.PID = B.PID
现在我们到达了似乎已经难倒的部分,如何在每个发布者的书籍和发布者之间获得多对一的关系,并在每个页面数量上执行聚合(在这种情况下为总和)书和每本书的价格。聚合部分已在我们的选择部分中完成,因此现在我们只需说明我们的组将来自哪个列,因为他们想知道每个发布者聚合我们将使用发布者名称进行分组:
Group by Pname
Order by PublishersPricePerPage Asc
最后一部分有一点问题,publisherpriceperpage是公式sum(bprice)/ Sum(bpages)的列别名。因为order by是在查询的所有其他部分之后完成的,所以我们可以使用列别名,查询的其他部分不允许这样做,而无需嵌套原始查询。所以既然你耐心地通过我的解释,这是最终产品:
select Pname as Publisher
, Sum(bpages) as PublishersTotalPages
, sum(bprice) as PublishersTotalPrice
, sum(bprice)/Sum(bpages) as PublishersPricePerPage
From Book B
Join Publisher P on P.PID = B.PID
Group by Pname
Order by PublishersPricePerPage Asc
祝你好运,希望这些解释能帮助你理解这个概念。
答案 2 :(得分:0)
ASC
是ORDER BY
子句的一部分。您在这里错过了ORDER BY
。
答案 3 :(得分:0)
基于您想要实现的目标。您可以在下面尝试我的查询。我在CASE
语句中使用了所述公式来捕获bprice
除以零(0)时的错误。此外,我在您的查询中添加了ORDER BY
子句,并且不需要AVG
聚合。
SELECT
pname,
CASE WHEN SUM(bpages)=0 THEN '' ELSE SUM(bprice)/SUM(bpages) END price
FROM book NATURAL JOIN publisher
GROUP BY pname
ORDER BY pname ASC;
答案 4 :(得分:0)
您需要Order By
进行排序,但缺少:
SELECT
pname,
bpages,
AVG(bprice)
FROM book NATURAL JOIN publisher
GROUP BY pname, bpages
order by AVG(bpages) ASC;
答案 5 :(得分:0)
检查
SELECT pname, AVG(bprice)
FROM book NATURAL JOIN publisher
GROUP by pname
ORDER BY AVG(bpages)