Mysql 用于聚合记录的SQL查询
我有四个表格:供应商、产品、销售和销售产品。“供应商”和“产品”表以一对多的关系关联,供应商可以拥有多个产品,而产品属于单个供应商。products和sales表以多对多关系连接,sales_products表充当连接products和sales表的中间表 表的示例结构: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
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。我不明白。折扣是指销售中的每个产品,而不是每个供应商。我看不出它们是如何分开的。这是我面临的问题,每个供应商都要被解约。我只是想知道这是否可以实现,如果可以,可能的问题是什么。