mysql - 检索每个 ID 的最新记录。如何,在 SQL 中?

标签 mysql sql database ms-access greatest-n-per-group

我有两张 table 。一张表存储库存项目的基本信息,如 id 和 description。另一个表存储每天结束时库存项目的状态;因此此表中有许多行具有相同的 inventoryItemID 但日期不同。下面基本上是我的表格的样子。

TABLE: listItems
|itemRecordNumber|itemName|minStock|reorderQty|note|
|      510       |  bag   |   10   |    20    |    |
|      511       |  ball  |   20   |    40    |    |
|      512       |  shoe  |   09   |    10    | xx |

,

TABLE: inventoryTrans
|itemRecordNumber|recordType|quantity| trans_date |
|      510       |    50    |   30   | 09/12/2013 |
|      510       |    40    |   33   | 09/12/2013 |
|      510       |    50    |   35   | 08/12/2013 |
|      510       |    40    |   35   | 08/12/2013 |
|      511       |    50    |   10   | 08/12/2013 |
|      511       |    40    |   15   | 09/12/2013 |
|      512       |    50    |   33   | 07/12/2013 |
|      512       |    40    |   34   | 09/12/2013 |

现在,我想要的是表 inventoryTrans 中每个 itemRecordNumber 的最新记录,并且只有类型 50(销售)的记录,但是等等,如果表 listItems 中某个项目的注释是 ' xx' 我对那个结果不感兴趣。我真正需要这张表的是数量。请注意,此表没有项目名称/minStock/reorderQty,这就是为什么我需要第一个表 listItems 来获取该信息。

所以在单个查询中我想得到,

|itemRecordNumber|itemName| trans_date |quantity|minStock|reorderQty|
|      510       |  bag   | 09/12/2013 |   30   |   10   |    20    |
|      511       |  ball  | 08/12/2013 |   10   |   20   |    40    |

所以我想要的是这些信息。请注意,它是每个 ID 的最新记录类型“50”,但由于 listItems.note 中该项目的注释为“xx”,因此排除了项目 512;

现在,在您批评表格的构造之前,这不是我可以改变的。这就是 Peachtree 会计(我公司手头正在使用的软件)的表格布局方式,所以这就是我必须使用的。目标是生成有关库存的自定义信息以实现更好的管理。

现在我如何为此构建一个 SQL 查询。我看到人们在其他一些类似的示例中使用 LEFT JOIN,但我无法让它工作。

最佳答案

开始了

http://sqlfiddle.com/#!2/d30823/1这是你的数据的例子

SELECT a.itemRecordNumber,
       a.itemName,
       max(b.trans_date) AS trans_date,
       b.quantity,
       a.minStock,
       a.reorderQty
FROM listItems a,
     inventoryTrans b
WHERE a.itemRecordNumber = b.itemRecordNumber
  AND a.note<>'xx'
  AND b.recordtype=50
GROUP BY a.itemRecordNumber

编辑: 如果是 MS Access(我无法测试),这应该可以工作,你能试试吗(我试过 MS SQL,这是我可以在 SQLFiddle 中测试的最接近的

http://sqlfiddle.com/#!3/d30823/2

SELECT a.itemRecordNumber,
       a.itemName,
       max(b.trans_date) AS trans_date,
       b.quantity,
       a.minStock,
       a.reorderQty
FROM listItems a,
     inventoryTrans b
WHERE a.itemRecordNumber = b.itemRecordNumber
  AND a.note<>'xx'
  AND b.recordtype=50
  AND b.trans_date =
    (SELECT max(trans_date)
     FROM inventoryTrans c
     WHERE c.itemRecordNumber = b.itemRecordNumber
       AND c.recordtype=50)
GROUP BY a.itemRecordNumber,
         a.itemName,
         b.quantity,
         a.minStock,
         a.reorderQty

如果出于任何原因它对您不起作用,请告诉我,我得到的结果与您的问题相同

关于mysql - 检索每个 ID 的最新记录。如何,在 SQL 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052199/

相关文章:

php - Laravel - 数据库查询约定/标准实践

mysql - 主键中的 DATE 会在范围扫描中获得性能吗?

MySQL逻辑计数操作

mysql - 为每个不同的名称显示表中最近添加的行

mysql - SQL : Replace integer with string when there is empty value

mysql - 外键引用本身

php - jquery/php/mysql 采购订购系统需要帮助

php - 无法使用登录功能

MySQL 外键错误

php - 以原子方式调用 Web 服务?