我有一张包含股票交易的表格:
+------+----------------------+------------------+
| Item | Running Stock Total | Transaction Time |
+------+----------------------+------------------+
| foo | 4 | 2012-05-12 11:07 |
| bar | 3 | 2012-05-12 10:42 |
| bar | 3 | 2012-05-12 9:42 |
| bar | 2 | 2012-05-11 15:42 |
| foo | 3 | 2012-05-11 10:02 |
| bar | 3 | 2012-05-10 13:44 |
...etc...
+------+----------------------+------------------+
Run Code Online (Sandbox Code Playgroud)
即任何时候发生库存事件,在此表中创建一行 - 这可能意味着库存水平上升(订购新库存),下降(库存销售)或保持不变(库存重新定位).
我需要创建一个sql查询,该查询仅返回特定部分的库存级别实际更改的行,并且需要在"库存增加"和"库存减少"列中显示更改.
即1 Item='bar'
+------+-----------+------------+----------------------+------------------+
| Item | Stock Up | Stock Down | Running Stock Total | Transaction Time |
+------+-----------+------------+----------------------+------------------+
| bar | 1 | 0 | 3 | 2012-05-12 9:42 |
| bar | 0 | 1 | 2 | 2012-05-11 15:42 |
| bar | 1 | 0 | 3 | 2012-05-10 13:44 |
+------+-----------+------------+----------------------+------------------+
Run Code Online (Sandbox Code Playgroud)
EG2 Item='foo'
+------+-----------+------------+----------------------+------------------+
| Item | Stock Up | Stock Down | Running Stock Total | Transaction Time |
+------+-----------+------------+----------------------+------------------+
| foo | 1 | 0 | 4 | 2012-05-12 11:07 |
| foo | 2 | 0 | 3 | 2012-05-11 10:02 |
+------+-----------+------------+----------------------+------------------+
Run Code Online (Sandbox Code Playgroud)
所以像......
SELECT
Item, {xyz} as 'Stock Up', {abc} as 'Stock Down', `Running Stock Total`, `Transaction Time`
FROM
`StockTransactions`
WHERE
`Item`='foo'
HAVING
('Stock Up'>0 or 'Stock Down'>0)
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
SELECT `Item`,
`Stock Up`,
`Stock Down`,
`Running Stock Total`,
`Transaction Time`
FROM (
SELECT `Item`,
GREATEST(`Running Stock Total` - @`last_total`, 0) AS `Stock Up`,
GREATEST(@`last_total` - `Running Stock Total`, 0) AS `Stock Down`,
`Running Stock Total`,
`Transaction Time`,
@`last_total` := `Running Stock Total`
FROM `StockTransactions` JOIN (SELECT @`last_total` := 0) AS lt
WHERE `Item` = 'bar'
ORDER BY `Transaction Time` ASC
) AS t
ORDER BY `Transaction Time` DESC
Run Code Online (Sandbox Code Playgroud)
在sqlfiddle上查看它。如果您愿意按照事务时间的升序对结果进行排序并使用额外的列,那么显然可以省略外部查询last_total。
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |