MySQL 从两个单独的 Table 汇总销售数据时出现问题
MySQL Problem While Summarizing Sale Data From Two Separate Table
非常感谢您的支持。
我正在学习 SQL 并生成一些数据来玩,但我被困在一件简单的事情上。下面屏幕截图中的 table 显示了我的 sales20 table 的一部分,它显示了每个员工在 2020 年实现的销售额以及地区和日期信息。
Table sales20
2021年我有同样的table。我想做的是;我想带上员工姓名、地区、员工在 2020 年和 2021 年实现的总销售额。我写了以下查询,但没有带上正确的数字。它带来了比应有的更高的东西。
重点是2020年和2021年的员工不一样。例如,2021 年有一名新员工,这意味着他也应该列出,但该员工的 2020 列应该为空。
我的查询:
SELECT sales20.staff,
sales20.region,
SUM(sales20.amount) AS Total_20,
SUM(sales21.amount) AS Total_21
FROM sales20
JOIN sales21 ON sales20.staff = sales21.staff
GROUP BY staff, region
部分结果截图:
Result:
你能告诉我我做错了什么吗?
SELECT sales20.staff,
sales20.region,
SUM(sales20.amount) AS Total_20,
SUM(sales21.amount) AS Total_21
FROM sales20
JOIN sales21
ON sales20.staff = sales21.staff
AND sales20.region = sales21.region
GROUP BY staff,
region
您需要根据员工和地区加入 2 个表,这样才能 one-to-one 加入。如果您仅根据员工加入,那么它会使 one-to-many 加入,因此您将得到损坏的输出。
另一种方法是合并来自 2 个表的数据,然后在其之上执行聚合。这应该会给您准确的结果。
WITH combined_data AS
(
SELECT staff,
region,
saledate,
amount
FROM sales20
UNION ALL
SELECT staff,
region,
saledate,
amount
FROM sales21
)
SELECT staff,
region,
SUM(CASE WHEN year(saledate) = 2020 THEN amount ELSE 0 END) AS Total_20,
SUM(CASE WHEN year(saledate) = 2021 THEN amount ELSE 0 END) AS Total_21
FROM combined_data
GROUP BY staff,
region
您正在连接两个表,而您需要它们的并集 -
SELECT staff,
region,
SUM(IF(YEAR(saledate) = '2020',amount,0) AS Total_20,
SUM(IF(YEAR(saledate) = '2021',amount,0) AS Total_21,
FROM (SELECT staff, region, amount, saledate
FROM sales20
UNION ALL
SELECT staff, region, amount, saledate
FROM sales21)
GROUP BY staff, region;
非常感谢您的支持。 我正在学习 SQL 并生成一些数据来玩,但我被困在一件简单的事情上。下面屏幕截图中的 table 显示了我的 sales20 table 的一部分,它显示了每个员工在 2020 年实现的销售额以及地区和日期信息。
Table sales20
2021年我有同样的table。我想做的是;我想带上员工姓名、地区、员工在 2020 年和 2021 年实现的总销售额。我写了以下查询,但没有带上正确的数字。它带来了比应有的更高的东西。 重点是2020年和2021年的员工不一样。例如,2021 年有一名新员工,这意味着他也应该列出,但该员工的 2020 列应该为空。
我的查询:
SELECT sales20.staff,
sales20.region,
SUM(sales20.amount) AS Total_20,
SUM(sales21.amount) AS Total_21
FROM sales20
JOIN sales21 ON sales20.staff = sales21.staff
GROUP BY staff, region
部分结果截图:
Result:
你能告诉我我做错了什么吗?
SELECT sales20.staff,
sales20.region,
SUM(sales20.amount) AS Total_20,
SUM(sales21.amount) AS Total_21
FROM sales20
JOIN sales21
ON sales20.staff = sales21.staff
AND sales20.region = sales21.region
GROUP BY staff,
region
您需要根据员工和地区加入 2 个表,这样才能 one-to-one 加入。如果您仅根据员工加入,那么它会使 one-to-many 加入,因此您将得到损坏的输出。
另一种方法是合并来自 2 个表的数据,然后在其之上执行聚合。这应该会给您准确的结果。
WITH combined_data AS
(
SELECT staff,
region,
saledate,
amount
FROM sales20
UNION ALL
SELECT staff,
region,
saledate,
amount
FROM sales21
)
SELECT staff,
region,
SUM(CASE WHEN year(saledate) = 2020 THEN amount ELSE 0 END) AS Total_20,
SUM(CASE WHEN year(saledate) = 2021 THEN amount ELSE 0 END) AS Total_21
FROM combined_data
GROUP BY staff,
region
您正在连接两个表,而您需要它们的并集 -
SELECT staff,
region,
SUM(IF(YEAR(saledate) = '2020',amount,0) AS Total_20,
SUM(IF(YEAR(saledate) = '2021',amount,0) AS Total_21,
FROM (SELECT staff, region, amount, saledate
FROM sales20
UNION ALL
SELECT staff, region, amount, saledate
FROM sales21)
GROUP BY staff, region;