SQL聚合AVG语句

时间:2015-02-24 05:01:04

标签: sql

好的,所以我对以下问题感到很困难。

表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;

6 个答案:

答案 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)

ASCORDER BY子句的一部分。您在这里错过了ORDER BY

参考:http://www.tutorialspoint.com/sql/sql-group-by.htm

答案 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)