SQL聚合AVG语句

SQL聚合AVG语句,sql,Sql,好的,我对下面的问题很难回答 表1:bookworm数据库的模式。主键带下划线。有一些外键引用将表链接在一起;您可以将其与自然连接一起使用 对于每个出版商,显示出版商的名称以及出版商出版的每页图书的平均价格。这里的平均每页价格是指总价格除以一套书的总页数;它不是(价格/页数)的平均值。以升序显示按每页平均价格排序的结果 Author(aid, alastname, afirstname, acountry, aborn, adied). Book(bid, btitle, pid, bdate,

好的,我对下面的问题很难回答

表1:bookworm数据库的模式。主键带下划线。有一些外键引用将表链接在一起;您可以将其与自然连接一起使用

对于每个出版商,显示出版商的名称以及出版商出版的每页图书的平均价格。这里的平均每页价格是指总价格除以一套书的总页数;它不是(价格/页数)的平均值。以升序显示按每页平均价格排序的结果

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


ASC
orderby
子句的一部分。您缺少此处的订购人


参考资料:

以您的目标为基础。你可以在下面尝试我的查询。我在
CASE
语句中使用了规定的公式来捕捉
bprice
除以零(0)时的错误。另外,我在查询中添加了
orderby
子句,不需要
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;

您需要ORDERBY子句而不是GROUPBY来对记录进行排序。因此,请将查询更改为:

SELECT pname, AVG(bprice)
FROM book NATURAL JOIN publisher
GROUP by pname
ORDER BY AVG(bpages) ASC;

您需要排序时使用
Order By
,缺少:

SELECT 
      pname,
      bpages, 
      AVG(bprice)
FROM book NATURAL JOIN publisher
GROUP BY pname, bpages
order by AVG(bpages) ASC;

你不能按聚合进行分组,至少不是这样。也不要使用自然连接,这是一个坏习惯,因为大多数时候你必须指定连接条件。这是你在课本上看到的东西之一,但在现实生活中几乎从未见过

好了,这是我的家庭作业,所以我不想在没有解释的情况下给你一个答案,聚合函数(在本例中是sum)会影响组中某列的所有值,受where子句和join条件的限制,因此,除非您对每一行都执行操作,否则您必须指定包含分组依据的值的列。在本例中,我们的组是Publisher name,他们想知道每个Publisher,每页的价格是多少。让我们为其编制一个快速选择语句:

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
在最后一部分中有一个小问题,publisherpliceperpage是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
祝你好运,希望解释能帮助你理解这个概念。

检查这个

     SELECT pname, AVG(bprice)
FROM book NATURAL JOIN publisher
GROUP by pname
ORDER BY AVG(bpages)

什么是RDBMS<代码>mysql<代码>oracle<代码>postgresql<代码>db2<代码>sql server?请在您的问题中添加相关标签。。。这是编程时不应该使用的SQL构造。如果向book或publisher添加了一列,而另一个表中已存在同名的列,则查询将停止工作。(不连接并指定连接列!)