mysql - 将 3 个表连接到一个表(Joining 4 Tables)
问题描述
我有 3 个销售表和 1 个包含所有产品 ID 的产品表。我需要将销售表与产品表结合起来以获得每周销售额。
我尝试了几种不同的连接方法和联合。每次我得到错误的输出(要么太多,要么像交叉连接)。目前,我运行 3 个不同的查询,导出这些表并在 Excel 中手动组合这些表。
我尝试过的连接示例。
SELECT p1.product, p2.week,
p2.sales, p2.QTY,
p3.sales, p3.QTY,
p4.sales, p4.QTY
FROM products_table p1 INNER JOIN aplha_sales p2 ON p1.alpha_product_id = p2.alpha_product_id
INNER JOIN beta_sales p3 ON p1.beta_product_id = p3.beta_product_id
INNER JOIN delta_sales p4 ON p1.delta_id = p4.delta_product_id
WHERE p2.week >= '2019-04-19';
我想要一个包含以下列的表格:
解决方案
您需要在联接中包含周,以便您只需从每个表中获取该周的数据。
SELECT p1.product, p2.week,
p2.sales, p2.QTY,
p3.sales, p3.QTY,
p4.sales, p4.QTY
FROM products_table p1
INNER JOIN aplha_sales p2 ON p1.alpha_product_id = p2.alpha_product_id
INNER JOIN beta_sales p3 ON p1.beta_product_id = p3.beta_product_id AND p3.week = p2.week
INNER JOIN delta_sales p4 ON p1.delta_id = p4.delta_product_id AND p4.week = p2.week
WHERE p2.week >= '2019-04-19';
请注意,这只会在所有 3 种产品都有销售的几周内生成行。您可以使用LEFT JOIN
2 表的可选销售。但是要使其对所有 3 个XXX_sales
表都是可选的,您需要与另一个定义所需周数的表连接,然后LEFT JOIN
与所有销售表连接。
SELECT p1.product, w.week,
p2.sales, p2.QTY,
p3.sales, p3.QTY,
p4.sales, p4.QTY
FROM products_table p1
CROSS JOIN (
SELECT week FROM alpha_sales WHERE week >= '2019-04-19'
UNION
SELECT week FROM beta_sales WHERE week >= '2019-04-19'
UNION
SELECT week FROM delta_sales WHERE week >= '2019-04-19') AS w
LEFT JOIN aplha_sales p2 ON p1.alpha_product_id = p2.alpha_product_id AND p2.week = w.week
LEFT JOIN beta_sales p3 ON p1.beta_product_id = p3.beta_product_id AND p3.week = w.week
LEFT JOIN delta_sales p4 ON p1.delta_id = p4.delta_product_id AND p4.week = w.week
子查询中的UNION
将组合任何销售表中的所有周。默认情况下,UNION
删除重复项,因此您不会每周获得多行。
推荐阅读
- android - 如何在 MaterialComponents.TextInputLayout 上填充下拉菜单
- c# - 为什么我收到 CS0103 错误 - ViewBag 不存在?
- java - 更改 jdk 版本后无法初始化类 org.codehaus.groovy.classgen.Verifier
- python -
到时间戳 - reactjs - 使用 React/Typescript 样式的组件重新设置 Bootstrap 组件的样式
- python - 如何键入提示返回 map() 对象的函数?
- configuration - 如何在创建任务时填充 Lead Object 上的 RelatedTo 字段(记录呼叫)
- c# - 在 google cloud>kubernetes 中运行控制台应用程序
- laravel - Laravel 使用模型中指定的连接,用于迁移
- c - 将字符串与 C 中的结构成员进行比较