【发布时间】:2021-07-21 01:01:31
【问题描述】:
我正在开发一个名为 classicmodels 的数据库。您可以在以下位置找到它:https://www.mysqltutorial.org/mysql-sample-database.aspx/
这家公司销售微型模型,分布在 7 个产品线中:老爷车、老爷车、飞机、卡车和公共汽车、飞机、火车和摩托车。
我想找出 2003 年和 2004 年最畅销的产品线(以销量和收入计)。
另外,我需要排除已取消的订单。这是由“订单”表中的“状态”列通知的。
因此,显然,我们必须连接三个表:“products”(按每个产品线对结果进行分组)、“orderdetails”(获取销售数量和单位价格)和“orders”(过滤结果) :仅选择 2003 年和 2004 年并排除已取消的订单)。
此外,需要说明的是,我们必须处理 1:M(一对多)对来解决这个问题,以避免组合/笛卡尔爆炸。
-
products --> orderdetails 是 1:M 关系
-
orderdetails --> 订单是1:M的关系
考虑到这一点,我决定创建子查询来建立 1:1 关系。所以,我计算了每个产品线的订购数量和总价值:
SELECT p.productLine, SUM(od.quantityOrdered) AS total_units, SUM(od.quantityOrdered*od.PriceEach) AS total_value
FROM products p
JOIN
orderdetails od ON p.productCode=od.productCode
GROUP BY p.productLine
ORDER BY total_value DESC;
结果如下:
现在,我不知道如何将上述子查询生成的表与“订单”表连接起来。这是因为它们没有任何可用于 JOIN 的公共列。
如何确定 2003 年和 2004 年最畅销的产品线(以销量和收入计),不包括取消的订单?
您可以在下面检查数据库的关系模式:
【问题讨论】:
-
你想达到什么目的?请分享表结构、示例输入数据以及与该示例数据对应的预期输出,并以文本形式(不是图像)分享所有这些信息
-
从你的描述中,你想加入产品线,那么做吗?
-
@NicoHaase 好的!我将数据库的关系模式添加到帖子中。对不起,您所说的示例输入数据是什么意思?另外,我不知道如何将 MySQL 查询的输出共享为文本。但我会尝试
标签: mysql sql join cartesian-product