如何通过关系表求和?

0g0grzrc  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(294)

我有一张产品表

+------------+---------------+---------------+
| ProductCod |    unitPrice  | name          |
+------------+---------------+---------------+
|          1 |            30 | some          |
|          2 |            20 | poor          |
|          3 |            10 | example       |
+------------+---------------+---------------+

另一种是销售(我相信这是不需要的),另一种是注册n..m关系

+------------+----------+------------+
|   quantity | sellCode | productCod |
+------------+----------+------------+
|          3 |        1 |          1 |
|          5 |        1 |          2 |
|          4 |        2 |          2 |
|          4 |        2 |          3 |
|          4 |        2 |          3 |
+------------+----------+------------+

如何选择产品列表以及在所有登记处销售了多少产品?
我想要这样的东西:

+---------+------+
|    name | sold |
+---------+------+
|    some |    3 |
|    poor |    9 |
| example |    8 |
+---------+------+
bq3bfh9z

bq3bfh9z1#

select p.Name, sum(s.Quantity) as sold
from Products p
left join Sales s on p.ProductCod = s.ProductCod
group by p.ProductCod, p.Name;

我们要做的是首先使用productcod公共字段连接两个表。我们使用的是left join,因为可能有一些产品还没有售出。然后我们将按productcod(和name)分组的数量相加。我们必须将它包含在列表中,因为它不是聚合表达式,而且每个productcod都有一个单独的名称。这是正确的,因为产品和销售之间存在一对多的关系。如果存在多对多关系,那么结果将是错误的。
编辑:检查这个SQLFIDLE示例是否有良好的格式。

yv5phkfx

yv5phkfx2#

在这里使用内部连接更精确。
查询

SELECT 
   products.name
 , SUM(sales.quantity) AS sold 
FROM 
 products
INNER JOIN 
 sales
USING(productCod)
GROUP BY 
 products.name
ORDER BY 
 products.ProductCod ASC

SELECT 
   products.name
 , SUM(sales.quantity) AS sold 
FROM 
 products
INNER JOIN 
 sales
ON
  products.productCod = sales.productCod 
GROUP BY 
 products.name
ORDER BY 
 products.ProductCod ASC

结果

|    name | sold |
|---------|------|
|    some |    3 |
|    poor |    9 |
| example |    8 |

请参见演示http://sqlfiddle.com/#!9/10cd3e/5号

相关问题