MySQL: сохранить последние данные строки в GROUP BY с помощью SUM - PullRequest
0 голосов
/ 18 декабря 2018

Я изо всех сил пытаюсь заставить запрос работать.У меня склад реализован с 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 использовался в качестве решения, но я не могу использовать его, потому что не все элементы перечислены в списке.

Есть ли альтернативы?

Заранее спасибо!

...