首页 > 解决方案 > SQL查询,具有相同类型(名称)的条目总和

问题描述

您好,我有 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?在 where 后面加上“ AND num_sell >2700”,因为在这种情况下它正常工作是行不通的。

标签: sqlsql-server

解决方案


从这个查询中可以学到很多东西。

FROM subsidiary, subsidiarybook, book

不要在FROM子句中的表名之间使用逗号。这样做的目的是将的每一subsidiary乘以 的每一行,subsidiarybook然后将结果乘以 中的每一行book。这就是为什么在您当前的结果中sum(num_sell)是一个常数 5,163,400 。

您的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

但要确切知道如何进一步提供帮助,我们需要更多地了解您的桌子

例如。我们不知道num_sell实际来自哪个表


推荐阅读