Я изо всех сил пытаюсь заставить запрос работать.У меня склад реализован с 2 столами.Один содержит элементы, а другой - журнал (количество входящих и исходящих сообщений) этих элементов.
Таблица элементов:
+----------+---------+--------+
| iPrimary | iNumber | iName |
+----------+---------+--------+
| 1 | i1 | Item 1 |
| 1 | i2 | Item 2 |
| 2 | i3 | Item 3 |
| 3 | i4 | Item 4 |
+----------+---------+--------+
Таблица журналов:
+----------+----------+-----------+-------------+---------------------+
| lPrimary | iPrimary | lNewCount | lDifference | lDateTime |
+----------+----------+-----------+-------------+---------------------+
| 1 | 1 | 400 | 400 | 2018-04-11 12:00:00 |
| 2 | 1 | 399 | -1 | 2018-04-14 12:00:00 |
| 3 | 1 | 450 | 51 | 2018-04-17 12:00:00 |
| 4 | 1 | 448 | -2 | 2018-04-20 12:00:00 |
| 5 | 2 | 300 | 300 | 2018-04-22 12:00:00 |
| 6 | 2 | 295 | -5 | 2018-04-24 12:00:00 |
| 7 | 2 | 293 | -2 | 2018-04-27 12:00:00 |
| 8 | 2 | 280 | -13 | 2018-04-30 12:00:00 |
| 9 | 2 | 300 | 20 | 2018-05-02 12:00:00 |
| 10 | 3 | 100 | 100 | 2018-05-04 12:00:00 |
| 10 | 3 | 90 | -10 | 2018-05-06 12:00:00 |
| 11 | 3 | 85 | -5 | 2018-05-08 12:00:00 |
+----------+----------+-----------+-------------+---------------------+
(Если количество предметов покидает склад, оно вставляется отрицательно в столбец базы данных lDifference , если число предметов поступает на склад, оно вставляется положительно. lNewCount сохраняет текущее общее количество нас указанием даты и времени.)
Теперь я хочу перечислить все элементы и их количество, суммы входящих счетов, суммы исходящих счетчиков за определенный промежуток времени.
Для промежутка времени между 2018-04-13 и 2018-05-07 результат должен быть:
+----------+---------+--------+-----------+----------------+----------------+
| iPrimary | iNumber | iName | lNewCount | lDifferencePos | lDifferenceNeg |
+----------+---------+--------+-----------+----------------+----------------+
| 1 | i1 | Item 1 | 448 | 51 | 3 |
| 2 | i2 | Item 2 | 300 | 320 | 20 |
| 3 | i3 | Item 3 | 90 | 100 | 10 |
| 4 | i4 | Item 4 | 0 | 0 | 0 |
+----------+---------+--------+-----------+----------------+----------------+
Это означает, что я даже хочу перечислять элементы, если на счетчиках не было активности.
Я почти получил результатыЯ хочу с помощью следующего запроса:
SELECT
`stock_log`.`iPrimary`,
`stock_item`.`iNumber`,
`stock_item`.`iName`,
`stock_log`.`lNewCount`,
SUM(
CASE
WHEN `stock_log`.`lDifference`>0
AND DATE(`stock_log`.`lDateTime`) >= "2018-04-13"
AND DATE(`stock_log`.`lDateTime`) <= "2018-05-07"
THEN `stock_log`.`lDifference` ELSE 0 END
) AS `lDifferencePos`,
ABS(SUM(
CASE WHEN `stock_log`.`lDifference`<0
AND DATE(`stock_log`.`lDateTime`) >= "2018-04-13"
AND DATE(`stock_log`.`lDateTime`) <= "2018-05-07"
THEN `stock_log`.`lDifference` ELSE 0 END
)) AS `lDifferenceNeg`
FROM `db`.`stock_log`
RIGHT JOIN `db`.`stock_item`
ON `stock_item`.`iPrimary` = `stock_log`.`iPrimary`
GROUP BY IFNULL(`stock_log`.`iPrimary`,UUID())
ORDER BY
`stock_item`.`iNumber`,
`stock_log`.`lDateTime` DESC,
`stock_log`.`iPrimary` DESC
Но проблема в том, что lNewCount содержит первое значение, когда-либо вставленное в базу данных этого элемента.Но я хочу получить значение последней вставленной строки (подсчет запасов в конце временного интервала), поэтому я хочу, чтобы GROUP BY сохранил последнюю строку вместо первой для каждой группы.Я нашел много решений, в которых оператор WHERE использовался в качестве решения, но я не могу использовать его, потому что не все элементы перечислены в списке.
Есть ли альтернативы?
Заранее спасибо!