Первая проблема заключается в том, что вы группировка по дате в вашем подзапрос 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
Таким образом, каждая строка из А соответствует каждой строке из В, дающей вам 6 полных строк.
Ваша третья проблема заключается в том, что вы затем группируете по дате, но не выполняете каких-либо агрегатов, не вдаваясь слишком много в мелкий шрифт стандарта SQL, предложение group by и функциональную зависимость, упрощаете его в MySQL позволяет это, но вы не должны этого делать, если не понимаете ограничений (это более подробно описано в этом вопросе в this answer). Все, что находится в элементе select, которое не находится в предложении group by, должно быть, должно быть в пределах совокупности.
Итак, из-за расширения GROUP BY Extension MySQL, выбирая все и группируя только по дате, то, что вы эффективно говорите, занимает 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;
EDIT
Я не могу проверить это, и я не уверен в вашей точной логики, но вы можете использовать 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'? Просто FULL JOIN результаты из таблицы A и таблицы B через столбец даты. – fabulaspb