2014-02-26 77 views
1

我有两张桌子。一个表格存储有关库存项目的基本信息,如ID和描述。另一张表在每天结束时存储库存物品的状态;因此此表中有许多行具有相同的inventoryItemID但日期不同。下面基本上是我的表格。检索每个ID的最近记录。如何在SQL中?

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 | 

现在,我要的是,从每个itemRecordNumber和类型50只的记录(销售)表inventoryTrans最近的战绩,但等待那里有更多的,如果一个项目的表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最近的recordType'50',但由于项目中的注释是listItems.note中的'xx',所以项目512被排除了;

现在在你批评表格的构造之前,我不能改变它。这就是Peachtree会计(我公司目前使用的软件)的表格是如何铺设的,所以这就是我必须处理的。我们的目标是生成定制的库存信息,以便更好地管理。

现在我该如何为此构造一个SQL查询。我看到有人在其他一些类似的例子中使用了LEFT JOIN,但是我不能让它起作用。

+0

只为你的人参考,请检查[this](http://www.codinghorror.com/blog /2007/10/a-visual-explanation-of-sql-joins.html) –

回答

0

虽然这不是最有效的方法,但它应该工作。

SELECT l.*, i.trans_date, i.quantity 
FROM listItems as l 
    JOIN (SELECT i.itemRecordNumber, MAX(trans_date) as date 
      FROM inventoryTrans as i GROUP BY i.itemRecordNumber 
    ) as x ON x.itemRecordNumber = l.itemRecordNumber 
    JOIN inventoryTrans as i ON l.itemRecordNumber = i.itemRecordNumber 
     AND i.trans_date = x.date 
WHERE i.recordType = 50 

虽然这会给一排itemRecordNumber = 512也一样,如果你不需要它,你可以根据你的需要添加WHERE和过滤。

1

在这里,我们去

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 
0测试最接近

让我知道,如果它因为任何原因不适用于你,我得到了与你的问题相同的结果

+1

你让我的投票只是为了使用SQLFiddle –

+0

感谢您指出我的错误,我编辑了我的问题。我认为Microsoft Access给了麻烦,因为我似乎无法得到这个sql语句的工作。我总是得到错误“”你试图执行一个查询,不包括指定的表达式'itemName'作为聚合函数的一部分。“”,如果我删除了itemName的SELECT,那么错误会转移到'quantity',如果我删除它,那么'minStock'和最后'reorderQty'。所以我所要显示的是itemRecordNumber和trans_date。我只能假设剩下的工作,但我不能说因为我不能查看数量 – matiszac

+1

是的Mysql可以容忍在选择比在组中的更多字段,没有其他数据库会容忍(据我所知)。在其他情况下,你必须以不同的方式处理它,你使用ms access或mysql吗?我很抱歉,如果我误解了,但如果你想访问,我可以查找,因为我没有在很长一段时间内使用 – skv

相关问题