【问题标题】:SQL query to aggregate records聚合记录的 SQL 查询
【发布时间】:2020-03-04 11:09:55
【问题描述】:

我有四个表:供应商、产品、销售和销售产品。供应商和产品表以一对多的关系关联,供应商可以拥有多个产品,一个产品属于单个供应商。 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 |
+----+------------+---------+----------+------------+

我想运行一个查询,从销售表中获取产品属于销售一部分的每个供应商的总折扣。查询可能会给出如下结果:

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

【问题讨论】:

  • 您好,您自己尝试过吗?如果是,请告诉我们。
  • 您的示例数据不可用,必须用 CREATE TABLE + INSERT INTO 脚本替换。您的样本数据不一致。您想要的结果与示例数据不匹配。您还没有定义结果形成的算法。您还没有表现出解决问题的尝试。

标签: mysql sql join group-by aggregates


【解决方案1】:

如果我理解正确,那么您只需要一堆joins 和聚合:

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(discount_amount) > 0

【讨论】:

  • 感谢您的建议@GordonLinoff。我确实想要一个join 和一个group by 查询。然而,结果可能不准确,假设您有属于同一供应商的两种不同产品的销售,因此折扣将添加两次而不是一次。销售表中的折扣并不适用于每个售出的产品,而是适用于销售的总成本。因此,查询必须汇总每个供应商的不同销售额的总折扣。我会很感激你的回答。
  • @RodgersWanyonyi。 . .我不明白。折扣是销售中的每个产品,而不是每个供应商。我看不出它们是如何分开的。
  • 这就是我们面临的问题,要获得每个供应商的折扣。我只是想知道它是否可以实现,如果可以,可能的查询是什么。
猜你喜欢
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
相关资源
最近更新 更多