SQL - 获取两列的总和,然后得到每列的平均值

时间:2016-02-11 16:02:56

标签: sql postgresql

解决问题并且在我获得两个单独列的总和后陷入如何获得平均值。我似乎无法弄清楚如何计算每个发布商的每页平均价格作为新列。我尝试在选择选项卡中使用AVG简单地包装两列并出现错误。 SELECT pname as Publsiher, SUM(bprice) as totalprice, SUM(bpages) as totalpages FROM publisher NATURAL JOIN book GROUP BY pname;

sqlresults

任何提示或帮助将不胜感激!子选择语句可能吗?

2 个答案:

答案 0 :(得分:1)

你使用师:

127.0.0.1

我建议您使用明确的# Set the bind address to a specific IP (IPv4 or IPv6): # network.host: 127.0.0.1 # # Set a custom port for HTTP: # # http.port: 9200 # SELECT pname as Publsiher, SUM(bprice) as totalprice, SUM(bpages) as totalpages, SUM(bprice) as totalprice / SUM(pbages) as avgPerPace FROM publisher NATURAL JOIN book GROUP BY pname; 子句替换NATURAL JOINUSING根据两个表中的键名选择连接键(而不是使用显式外键关系),所以我认为这是一个等待发生的错误。

答案 1 :(得分:0)

戈登的回答确实奏效了,他对加盟的评论也很明显。但是你需要检查你得到的平均值是否适合你使用它的上下文。

如果您将总价格除以总页数,您将获得一个按每本书的大小加权的数字。如果您获得每本书的每页价格,那么平均值,每本书将具有相同的权重。

WITH book AS
  (SELECT 'Publisher A' AS pname, 'Book 1' AS bname, 10 bprice, 1000 bpage FROM DUAL
  UNION SELECT 'Publisher A', 'Book 2', 10, 1000  FROM DUAL
  UNION SELECT 'Publisher A', 'Book 3', 10, 1000  FROM DUAL
  UNION SELECT 'Publisher A', 'Book 4', 10, 1000  FROM DUAL
  UNION SELECT 'Publisher A', 'Book X', 1000, 1  FROM DUAL)

SELECT pname AS Publisher,
    Sum(bprice),
    Sum(bpage),
    Round(Sum(bprice) / Sum(bpage), 3) totalAvgPerPage,
    Avg(bprice / bpage) avgPerPagePerBook
FROM book
GROUP BY pname;

结果:

PUBLISHER     SUM(BPRICE)   SUM(BPAGE)  AVGPERPAGE  AVGPERPAGEPERBOOK
Publisher A   1040          4001        .26         200.008

在这个荒谬的例子中,大多数书籍每页0.01英镑,但书籍X每页1000英镑。一个平均值不会受到影响,因为它只是一个页面,但另一个平均值受到很大影响,因为它将每本书视为同等有效。