您好,我有3个不同的数据库,其中列出了一些有关书籍的不同内容。我正在寻找一种方法来编写SQL函数,该函数可以为我提供每个子公司(分支机构)出售的书籍总和,而只有总和大于2700 +的书籍必须属于浪漫类。香港专业教育学院轻松找出功能:
SELECT name, SUM(num_sell) as 'numSum'
FROM subsidiary,subsidiarybook,book
WHERE genre= "Romance"
group by name
由于你们看不到那里的所有数据,我只想问为什么我总是只得到总输出完全相同的分支的不同名称。我想这只是第一个总数的总和,而不是属于不同名称的实际总和。
输出如下:
Amazonhive 5163400
Celestial Library 5163400
Cloudcast 5163400
Cosmic Library 5163400
Globalworld 5163400
Imaginetworks 5163400
Leopardworks 5163400
Quick Rooster Media 5163400
Radiantelligence 5163400
Royal Library 5163400
Sphinx Brews 5163400
Spring Harbor ... 5163400
Surge Records 5163400
Tiny Mermaid Arts 5163400
Triumphoods 5163400
Tucan Productions 5163400
这些值应该不同,因为这些值的总和肯定不相同。希望能有所帮助。另外,我如何检查总和是否大于2700?在这种情况下,将“ AND num_sell> 2700”放在通常可以正常工作的位置后面即可。
答案 0 :(得分:3)
从此查询中可以学到很多东西。
FROM subsidiary, subsidiarybook, book
请勿在{{1}}子句中的表名之间使用逗号。这样做是将FROM
的每一行乘以subsidiary
的每一行,然后将{strong>结果乘以乘以subsidiarybook
的每一行。这就是book
在当前结果中常数为5,163,400 的原因。
您的sum(num_sell)
子句应该看起来更像这样:
FROM
一旦更正了联接(上面显示的联接是在忽略表的实际列名的情况下完成的!),那么您应该开始在FROM subsidiary
INNER JOIN subsidiarybook ON subsidiary.id = subsidiarybook.subsidiary_id
INNER JOIN book ON sb.book_id = book.id
中看到更好的结果。要过滤任何聚合的结果,请使用sum(num_sell)
子句。
HAVING
现在,可能还有更多的东西要学习。例如,SELECT book.name, SUM(num_sell) as 'numSum'
FROM subsidiary
INNER JOIN subsidiarybook ON subsidiary.id = subsidiarybook.subsidiary_id
INNER JOIN book ON sb.book_id = book.id
GROUP BY book.name
HAVING SUM(num_sell) > 2700
对于最终结果似乎不是必需的,并且也许可以简化为:
subsidiary
但是要确切地知道如何进一步提供帮助,我们需要更多地了解您的表。
例如我们不知道SELECT book.name, SUM(num_sell) as 'numSum'
FROM subsidiarybook
INNER JOIN book ON sb.book_id = book.id
GROUP BY book.name
HAVING SUM(num_sell) > 2700
实际来自哪个表
答案 1 :(得分:1)
HAVING
子句将过滤GROUP BY
之后的行。 Reference
在HAVING SUM(num_sell) > 2700
之后添加GROUP BY
,以实现所需的过滤。
了解SELECT
语句的逻辑处理顺序是一种有价值的工具。 Reference
答案 2 :(得分:1)