第一个问题是,你按日期在你的子查询B
分组,但你不选择它,所以你的结果集可能是这样的:
weightSum barcodeCount
---------------------------
26 8
9 14
4 7
这是结果3个日期,但你不知道哪一行是指哪个日期。
你的下一个问题是,您使用的是交叉连接,这是因为你的两个查询之间没有联系,这意味着如果你的第一个查询返回:
Date qtySum weightSum
----------------------------------------
2016-01-20 1 1
2016-01-21 2 2
你做了之后这个交叉连接你结束
Date qtySum a.weightSum b.weightSum barcodeCount
--------------------------------------------------------------------------
2016-01-20 1 1 26 8
2016-01-20 1 1 9 14
2016-01-20 1 1 4 7
2016-01-21 2 2 26 8
2016-01-21 2 2 9 14
2016-01-21 2 2 4 7
所以A的每一行都与B的每一行相匹配,给你6个总行。
你的第三个问题是,你然后按日期分组,但不执行任何聚合,没有深入研究SQL标准,group by子句和函数依赖关系的细节,让它简化为MySQL允许这样做,但除非你明白限制(这在this answer的更详细的介绍中),否则你不应该这样做。 select中不在group by子句中的任何内容可能应该在聚合中。因此,由于MySQL的GROUP BY扩展通过选择所有内容并仅按日期分组,所以您实际上说的是每个日期取1行,但您无法控制哪一行,它可能是每行的第一行如上面显示的,所以你会得到的结果是组:
Date qtySum a.weightSum b.weightSum barcodeCount
--------------------------------------------------------------------------
2016-01-20 1 1 26 8
2016-01-21 2 2 26 8
我想这是为什么你从子查询B中的所有相同的价值观结束了重复。
因此,这涵盖了什么是错误的,现在解决方案,假设stock_list
中的日期在selected_items
中不存在,反之亦然,您将需要一个完整的连接,但是因为这在MySQL中不受支持你将不得不使用UNION
,最简单的方法是:
SELECT t.Date,
SUM(t.StockQuantity) AS StockQuantity,
SUM(t.StockWeight) AS StockWeight,
SUM(t.SelectedWeight) AS SelectedWeight,
SUM(t.BarcodeCount) AS BarcodeCount
FROM ( SELECT date,
SUM(qty) AS StockQuantity,
SUM(weight) AS StockWeight,
0 AS SelectedWeight,
0 AS BarcodeCount
FROM stock_list
GROUP BY Date
UNION ALL
SELECT date,
0 AS StockQuantity,
0 AS StockWeight,
SUM(weight) AS SelectedWeight,
COUNT(BarCode) AS BarcodeCount
FROM selected_items
GROUP BY Date
) AS t
GROUP BY t.Date;
编辑
我不能对此进行测试,我也不是确保您的确切逻辑的,但你可以使用variables to calculate a running total in MySQL。这应该给如何做的想法:
SELECT Date,
StockQuantity,
StockWeight,
SelectedWeight,
BarcodeCount,
(@w := @w + StockWeight - SelectedWeight) AS TotalWeight,
(@q := @q + StockQuantity - BarcodeCount) AS TotalQuantity
FROM ( SELECT t.Date,
SUM(t.StockQuantity) AS StockQuantity,
SUM(t.StockWeight) AS StockWeight,
SUM(t.SelectedWeight) AS SelectedWeight,
SUM(t.BarcodeCount) AS BarcodeCount
FROM ( SELECT date,
SUM(qty) AS StockQuantity,
SUM(weight) AS StockWeight,
0 AS SelectedWeight,
0 AS BarcodeCount
FROM stock_list
GROUP BY Date
UNION ALL
SELECT date,
0 AS StockQuantity,
0 AS StockWeight,
SUM(weight) AS SelectedWeight,
COUNT(BarCode) AS BarcodeCount
FROM selected_items
GROUP BY Date
) AS t
GROUP BY t.Date
) AS t
CROSS JOIN (SELECT @w := 0, @q := 0) AS v
GROUP BY t.Date;
谢谢@Jens你能帮助解决方案。 – AndroidNewBee
为什么你不使用连接? – Jens
为什么不使用'JOIN'运算符?从表A和表B到日期栏的简单FULL JOIN结果。 – fabulaspb