2016-08-30 88 views
-1

Table schema根據單獨的查詢獲取每行的平均值

以上是我的表架構。我的任務是編寫一條SQL命令,爲每個發佈者顯示發佈者的名稱,發佈者的位置以及發佈者銷售的圖書的平均成本。我有一個主要工作查詢:

SELECT Publisher.name, Publisher.location, 
(SELECT AVG(Book.cost) 
FROM (Book 
INNER JOIN Publisher 
ON Book.publisherName = Publisher.name) 
WHERE Book.publisherName = Publisher.name 
) bookAverage FROM Book 
INNER JOIN Publisher ON Book.publisherName = Publisher.name; 

的問題是,它返回的所有書籍在Books表中的平均水平。我怎樣才能改變這一點,只返回與每個出版商相關的書籍的平均成本?

下面是與模式的小提琴已經實現了:

http://sqlfiddle.com/#!9/7a9909/11/0

回答

3
SELECT p.name, p.location, AVG(b.Cost) as AverageBookCost 
FROM 
    Publisher p 
    INNER JOIN book b 
    ON b.publisherName = p.name 
GROUP BY 
    p.name, p.location 

http://sqlfiddle.com/#!9/7a9909/18

只有1加入,沒有子查詢,內部選擇什麼需要,你正在尋找的直線前進表間連接的聚合。只需正確指定您的GROUP BY子句。

1

你就近了。你只有太多的JOIN s。例如,子查詢只需要相關條款:

SELECT p.name, p.location, AVG(b.cost) as bookAverage 
FROM Publisher p JOIN 
    Book b 
    ON b.publisherName = p.name 
GROUP BY p.name, p.location; 
0
SELECT Publisher.name, Publisher.location, costs.avg_cost 
FROM Publisher 
INNER JOIN (
    SELECT AVG(Book.cost) as avg_cost, Book.publisherName 
    FROM Book 
    GROUP BY Book.publisherName 
) AS costs ON costs.publisherName = Publisher.name; 
+1

這個答案出現在低質量的審查隊列中,大概是因爲你沒有提供任何代碼的解釋。如果此代碼回答此問題,請考慮添加一些文字,說明答案中的代碼。這樣,你就更有可能獲得更多讚揚 - 並幫助提問者學習新東西。 – lmo

+0

@Imo沒問題,我只是認爲問題的作者和解決方案非常接近,他不需要詳細的解釋。 –

0

補全:

SELECT p.name, p.location, 
     (SELECT AVG(b.cost) 
     FROM Book b 
     WHERE b.publisherName = p.name 
     ) as bookAverage 
FROM Publisher p; 

如果你寫這爲JOIN,你會正確使用LEFT JOINGROUP BY寫來自@Matt的最佳答案/解決方案您可以獲得發行商名稱發行商地點圖書 NBR,在一個單杆書籍和每本書平均價格總成本很容易:

SELECT b.publisherName, p.location, COUNT(1) AS total_books, 
ROUND(SUM(cost), 2) AS books_total_cost, ROUND(AVG(cost), 2) AS avg_cost_per_book 
FROM book b 
JOIN publisher p ON p.name = b.publisherName 
WHERE 1=1 
GROUP BY b.publisherName 
ORDER BY b.publisherName 
; 

我想查詢本身是非常不言自明,但如果您有任何問題 ,請作爲我的客人:)