2015-02-24 99 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)