显示平均价格,高价和总价格字段


SELECT tb_publisher.book_name, AVG(tb_book.price) as average, MAX(tb_book.price), SUM(tb_book.price) 
FROM tb_book 
INNER JOIN tb_publisher 
on tb_book.id_publisher = tb_publisher.id_publisher 
WHERE 'average' < 70000 
GROUP BY tb_publisher.publisher_name

我想显示一个数据,其中平均字段小于70000(应该仅是低于该数字的1个记录),我无法理解为什么它不想显示,而不是显示所有数据。我尝试了我所知道的所有事情,因此会很感激。谢谢您的关注。

在您的查询中,您正在做: WHERE 'average' < 70000,这意味着您将string 'average'integer 700000进行比较,这当然不是您想做的。

您正在尝试在聚合列上过滤。这就是HAVING clause的确切定义。

SELECT tb_publisher.book_name, AVG(tb_book.price) as average, MAX(tb_book.price), SUM(tb_book.price) 
FROM tb_book 
INNER JOIN tb_publisher 
    ON tb_book.id_publisher = tb_publisher.id_publisher 
GROUP BY tb_publisher.publisher_name
HAVING AVG(tb_book.price) < 70000 

在其他注释中,您可能需要GROUP BY主键而不是名称。

大多数数据库让您参考having子句中的表别名,因此看起来像:

SELECT p.publisher_name, AVG(b.price) as average, MAX(b.price), SUM(b.price) 
FROM tb_book b INNER JOIN
     tb_publisher p 
     ON b.id_publisher = p.id_publisher 
GROUP BY p.publisher_name
HAVING average < 70000 ;

注意:

  • SELECT中的未参数列应与GROUP BY中的列匹配。我不确定您是否想要书籍或出版商的信息,但我猜是出版商。
  • 使用表别名。这些使查询更容易编写和阅读。
  • 某些数据库确实具有整数算术。如果price是整数,并且您想要小数位置,则可能需要AVG(b.price * 1.0)或类似的东西。
  • 并非所有数据库都支持HAVING子句中表别名的使用。
  • 如果您想非常小心,则会通过p.id_publisher汇总,因为两个不同的发布者可能具有相同的名称。

最新更新