相关子查询以查找某些组的平均值

Correlated Subquery to find AVG of certain groups

问题!我正在尝试列出所有书籍及其相应的书籍主题、平均成本和常规成本。

到目前为止我的查询是...

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

此查询提供了四组总成本的平均值。 Final out put should look like this 我需要引入 BOOK_NUMBOOK_TITLEBOOK_SUBJECTBOOK_COST,但我无法弄清楚。有人可以帮忙吗?相关子查询?

使用子查询来执行此操作:

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

请尝试以下...

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 的内容按 BOOK_SUBJECT 分组,然后使用 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

我们需要 select BOOK_SUBJECT 部分是因为 GROUP BY 子句需要它,部分是因为我们需要它来将此子查询生成的 table 加入到BOOK.

的未分组列表

AVG( BOOK_COST ) 别名 AVG_BOOK_COST 可以更容易地引用这个生成的字段。

在单词 JOIN 之前没有连接类型的情况下,大多数版本的 SQL 将采用 INNER JOIN,尽管所有版本都允许使用 INNER JOIN 并且一些要求你这样做。默认情况下,我和许多其他人只是使用 JOIN.

执行连接后,来自 BOOK 的每条记录都将从我们的子查询(我给它的别名是 SUBJECT_AVG_FINDER)中获得对应记录的副本,每条记录有两个名为 BOOK_SUBJECT 的字段。为了不混淆您的 SQL 版本,我们必须指定 table / 子查询以及发生此类重复的字段名称,因此在整个语句的第三行中指定 BOOK.BOOK_SUBJECT

已根据您想要的最终输出图像为每个字段指定别名。

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

最后,我通过添加行 ORDER BY BOOK_NUM.

根据您想要的输出对结果进行了排序

作为提示,尽管允许,但您应该避免大声喊叫(即全大写)您的字段名称、table 名称和别名(除非您被要求这样做),但仍然大声喊叫SQL 的东西(比如 SELECTFROMAS 等)。通过提供关于如何尝试使用每个单词的视觉线索,这可以使语句更易于阅读和调试。我建议采用以下方式来呈现我们的 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;

如果您有任何问题或意见,请随时post发表相应的评论。

使用此代码

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