请尝试以下...
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;
如果您有任何问题或意见,然后请随时据此发布评论。
您是否使用SQL-Server,MySQL发,还是其他什么东西?请为您正在使用的内容添加标签,但不要添加其他标签。 – toonice
您还应该包括书籍表的完整结构(以及其加入的任何其他表)。否则答案将是纯粹的猜测 – StevieG