mysql - SQL 查询以显示对 "total"列的更改

标签 mysql sql

我有一个包含股票交易的表格:

+------+----------------------+------------------+
| 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...
+------+----------------------+------------------+

即任何时候库存发生变化,都会在此表中创建一行 - 这可能意味着库存水平上升(订购新库存)、下降(库存已售出)或保持不变(库存已搬迁)。

我需要创建一个 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 |
+------+-----------+------------+----------------------+------------------+

例如 2 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 |
+------+-----------+------------+----------------------+------------------+

所以像...

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)

这可以做到吗?

最佳答案

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

查看 sqlfiddle .如果您希望结果按事务时间的升序排列并带有额外的 last_total 列,则显然可以省略外部查询。

关于mysql - SQL 查询以显示对 "total"列的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10683748/

相关文章:

mysql - 如何在表上添加 ON DELETE 约束?

php - Mysql 对于具有相似 where 子句的 2 个查询返回不同的结果

java - Tomcat 7 性能问题 (WIN 7 x64)

php - 如何检查 paypal iPN 是否响应(用于保护黑客)?

php - 使用 PHP 连接到 SQL Server?

sql - 后缀 : Using previous calculated value in WHERE clause

sql - 在 PL/SQL 中创建临时表

php - 如何编写此 SQL 语句来获取广告并发布? (PHP/MySQL)

mysql - Grails 立即提交事务中的对象

php - 如何通过 Internet 将数据更新远程发送到托管的 MySQL 数据库?