2015-02-24 97 views
0

好的,所以我对以下问题有实际困难。SQL聚合AVG语句

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

和接收

ERROR: syntax error at or near "asc" LINE 3: group by avg(bpages) asc;

+0

什么** ** RDBMS? 'mysql'? 'oracle'? 'postgresql'? 'db2'? 'SQL-server'?请在您的问题中添加相关标签 – 2015-02-24 05:52:33

+0

NATURAL JOIN ...这是您编程时不应使用的SQL构造。如果列被添加到书籍或发布者,并且另一个表中已经存在具有相同名称的列,则查询将停止工作。 (请加入并指定加入列!) – jarlh 2015-02-24 10:10:56

回答

1

您不能按合计,至少不是这样的。也不要使用自然连接,因为大部分时间你必须指定连接条件,这是不好的习惯。这是你在课本中看到但在现实生活中几乎没有的东西之一。

好吧,因为这样做,所以我不想给你一个答案没有解释,聚合函数(在这种情况下总和)会影响组内一列的所有值作为由where子句和连接条件限制,所以除非你每做一行都必须指定哪一列包含你正在分组的值。在这种情况下,我们的小组是发布商名称,他们想知道每个发布商,每个页面的价格是多少。让我们制定出一个快速的select语句:

select Pname as Publisher 
    , Sum(bpages) as PublishersTotalPages 
    , sum(bprice) as PublishersTotalPrice 
    , sum(bprice)/Sum(bpages) as PublishersPricePerPage 

接下来我们要确定从哪里得到的信息以及表如何与海誓山盟,我们将用书为基础(尽管由于性质左或右加入它并不重要)。我们知道有一个外键的列的PID之间的书表,并在发布表中的列PID关系:

From Book B 
    Join Publisher P on P.PID = B.PID 

这就是所谓的明确的加盟,我们都明确说明两列之间等价于两张桌子(vs.如果在where子句中完成则暗示等价)。这给了我们一对多的关系,因为每个出版商都有很多书出版。要看到,只需运行下面:

select b.*, p.* 
From Book B 
    Join Publisher P on P.PID = B.PID 

现在,我们得到的是似乎难倒你的一部分,如何让许多书籍和出版商之间的一个关系到一行每次发布者和执行对每本书的页数和每本书的价格进行汇总(在这种情况下为总和)。聚合部分已经在我们的选择部分完成了,所以现在我们只需说明我们的组将来自哪个列的值,因为他们想知道每个发布者聚合我们将使用发布者名称进行分组:

Group by Pname 
Order by PublishersPricePerPage Asc 

在最后一部分有一点小问题,publisherpriceperpage是公式总和(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 

祝你好运,希望解释帮助你得到的概念。

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

您需要ORDER BY子句而不是GROUP BY来排序记录。因此,改变你的查询:

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

你需要Order By进行排序,这是丢失:

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

入住这

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