2017-04-26 62 views
1

问题!我试图列出所有书籍及其相应的图书主题,平均成本和常规成本。查找某些组的AVG的相关子查询

到目前为止,我查询...

SELECT BOOK_SUBJECT, AVG(BOOK_COST) 
FROM BOOK 
GROUP BY BOOK_SUBJECT 

该查询给了我四组总成本的平均。 Final out put should look like this我需要携带BOOK_NUM,BOOK_TITLE,BOOK_SUBJECT, BOOK_COST,但我无法弄清楚。有人可以帮忙吗?相关的子查询?

+0

您是否使用SQL-Server,MySQL发,还是其他什么东西?请为您正在使用的内容添加标签,但不要添加其他标签。 – toonice

+0

您还应该包括书籍表的完整结构(以及其加入的任何其他表)。否则答案将是纯粹的猜测 – StevieG

回答

0

请尝试以下...

SELECT BOOK_NUM AS Number, 
     BOOK_TITLE AS Title, 
     BOOK.BOOK_SUBJECT AS Subject, 
     BOOK_COST AS Cost, 
     AVG_BOOK_COST AS 'Avg Cost' 
FROM BOOK 
JOIN (SELECT BOOK_SUBJECT AS BOOK_SUBJECT, 
       AVG(BOOK_COST) AS AVG_BOOK_COST 
     FROM BOOK 
     GROUP BY BOOK_SUBJECT 
    ) AS SUBJECT_AVG_FINDER ON BOOK.BOOK_SUBJECT = SUBJECT_AVG_FINDER.BOOK_SUBJECT 
ORDER BY BOOK_NUM; 

计算平均为我们的BOOK_SUBJECT并有一批BOOK内容的每个主题使用AVG(BOOK_COST)找到每个组的平均值。但是我们也希望避免将BOOK中的其他字段进行分组,而不是将Book中每条记录的指定字段与它们的BOOK_SUBJECT的平均成本加在一起显示。这表明在BOOK和用于查找每个主题的平均成本的子查询之间的INNER JOIN

我用下面的代码找到在BOOK列出的每个科目的平均平均成本...

SELECT BOOK_SUBJECT AS BOOK_SUBJECT, 
     AVG(BOOK_COST) AS AVG_BOOK_COST 
FROM BOOK 
GROUP BY BOOK_SUBJECT 

我们需要选择BOOK_SUBJECT部分原因是GROUP BY条款需要它,部分是因为我们需要它将此子查询生成的表加入BOOK的未分组列表中。

给予AVG(BOOK_COST)AVG_BOOK_COST的别名使得引用此生成的字段变得更容易。

在没有连接类型JOIN之前,大多数版本的SQL将假定为INNER JOIN,尽管所有允许使用INNER JOIN都可以使用,有些需要您这样做。默认情况下,我和其他许多人只是使用JOIN

一旦执行从BOOK每条记录​​将有一个副本的它的相应的从我们的子查询记录(这是我给的SUBJECT_AVG_FINDER别名),离开联同两个字段每条记录称为BOOK_SUBJECT。为了不混淆你的SQL版本,我们必须在总体语句的第三行中指定表/子查询以及发生此类重复的字段名称,因此BOOK.BOOK_SUBJECT

根据您想要的最终输出图像,每个字段都有一个别名。

我假定没有必要复制行号字段。如果这不正确,请另行说明。

最后,我已经根据您的期望输出对结果进行了排序,添加了行ORDER BY BOOK_NUM

作为一个提示,虽然它是允许的,你应该避免使用呼喊(即,全部大写)你的字段名称,表名和别名(除非你被要求这样做),但仍然喊SQL的东西(如SELECT,FROM,AS等)。通过提供关于如何尝试使用每个单词的视觉线索,这可以使语句更易于阅读和调试。我建议展示我们的SQL语句,而不是下面的方式...

SELECT book_num AS Number, 
     book_title AS Title, 
     book.book_subject AS Subject, 
     book_cost AS Cost, 
     avg_book_cost AS 'Avg Cost' 
FROM book 
JOIN (SELECT book_subject AS book_subject, 
       AVG(book_cost) AS avg_book_cost 
     FROM book 
     GROUP BY book_subject 
    ) AS subject_avg_finder ON book.book_subject = subject_avg_finder.book_subject 
ORDER BY book_num; 

如果您有任何问题或意见,然后请随时据此发布评论。

0

使用子查询做到这一点:

SELECT BOOK.BOOK_NUM, BOOK.BOOK_TITLE, BOOK.BOOK_SUBJECT, BOOK.BOOK_COST, T.AVG_COST 
FROM BOOK 
INNER JOIN (
    SELECT BOOK_SUBJECT, AVG(BOOK_COST) AVG_COST 
    FROM BOOK 
    GROUP BY BOOK_SUBJECT 
) T ON BOOK.BOOK_SUBJECT = T.BOOK_SUBJECT 
0

使用此代码

SELECT BOOK_NUM, BOOK_TITLE, BOOK_SUBJECT, BOOK_COST, 
AVG(BOOK_COST) OVER(PARTITION BY BOOK_SUBJECT) AS AVG_COST 
FROM BOOK