Mysql 用于聚合记录的SQL查询

Mysql 用于聚合记录的SQL查询,mysql,sql,join,group-by,aggregates,Mysql,Sql,Join,Group By,Aggregates,我有四个表格:供应商、产品、销售和销售产品。“供应商”和“产品”表以一对多的关系关联,供应商可以拥有多个产品,而产品属于单个供应商。products和sales表以多对多关系连接,sales_products表充当连接products和sales表的中间表 表的示例结构: 1. suppliers +----+--------------------+ | id | name | +----+--------------------+ | 1 | Sup A

我有四个表格:供应商、产品、销售和销售产品。“供应商”和“产品”表以一对多的关系关联,供应商可以拥有多个产品,而产品属于单个供应商。products和sales表以多对多关系连接,sales_products表充当连接products和sales表的中间表

表的示例结构:

1. suppliers
+----+--------------------+
| id | name               |
+----+--------------------+
|  1 | Sup A              |
|  2 | Sup B              |
|  3 | Cus A              |
|  4 | Cus B              |
|  5 | Sky Song Fireworks |
+----+--------------------+

 2. products
+----+--------------------+-------------+
| id | name               | supplier_id |
+----+--------------------+-------------+
|  1 | Pop Pops           |           6 |
|  2 | Pop Pops           |           5 |
|  3 | Color Pop Pop Snap |           5 |
|  4 | Rubbing Bang       |           5 |
|  5 | Kids Bag           |           5 |
+----+--------------------+-------------+

 3. sales
+----+-----------------+-----------------------+
| id | discount_amount | receipt               |
+----+-----------------+-----------------------+
|  4 |            NULL | RCT-19-10-12-04/06/51 |
|  5 |            2000 | RCT-19-10-14-07/36/58 |
|  6 |            NULL | RCT-19-10-14-07/40/28 |
|  7 |            NULL | RCT-19-10-15-12/10/20 |
|  8 |            2000 | RCT-19-10-15-12/14/51 |
+----+-----------------+-----------------------+

4. sale_products
+----+------------+---------+----------+------------+
| id | product_id | sale_id | quantity | unit_price |
+----+------------+---------+----------+------------+
|  1 |        335 |       1 |        4 |        150 |
|  2 |        336 |       2 |        4 |       1000 |
|  3 |        335 |       3 |        5 |        150 |
|  4 |        445 |       4 |        5 |        150 |
|  5 |        564 |       5 |      100 |        200 |
+----+------------+---------+----------+------------+
我想运行一个查询,从sales表中获取每个供应商的总折扣,这些供应商的产品是销售的一部分。查询可以给出如下结果:

+----+--------------------+----------------+
| id | name               | total_discount |
+----+--------------------+----------------+
|  1 | Sup A              | 1000           |
|  2 | Sup B              | 200            |
+----+--------------------+----------------+

如果我理解正确,那么您只需要一组
join
s和聚合:

select s.id, s.name, sum(discount_amount)
from suppliers s join
     products p
     on p.supplier_id = s.id join
     sale_products sp
     on sp.product_id = p.id join
     sales sa
     on sp.sale_id = sa.id
group by s.id, s.name;

如果您只想要折扣不为空的行,您可能需要添加
having sum(折扣金额)>0

您好,您自己尝试过什么吗?如果是,请向我们展示。您的示例数据不可用,必须用CREATE TABLE+INSERT INTO脚本替换。您的示例数据不一致。您期望的结果与示例数据不匹配。您尚未定义结果形成的算法。您尚未尝试解决您的问题。感谢您的建议@GordonLinoff。我确实需要一个
join
groupby
查询。但是,结果可能不准确,假设您销售的是属于同一供应商的两种不同产品,因此折扣将增加两次而不是一次。销售表中的折扣不适用于每种已售出的产品,而是适用于销售的总成本。因此,查询必须汇总每个供应商不同销售额的总折扣。谢谢你的回答。@Rodgerswanyony。我不明白。折扣是指销售中的每个产品,而不是每个供应商。我看不出它们是如何分开的。这是我面临的问题,每个供应商都要被解约。我只是想知道这是否可以实现,如果可以,可能的问题是什么。