【问题标题】:SQL Match Values in One Table to Highest Values in another Table to Pull Date from Another TableSQL 将一个表中的值与另一个表中的最大值匹配以从另一个表中提取日期
【发布时间】:2014-08-26 16:27:30
【问题描述】:

我正在尝试确定上次收到库存商品的时间,并且只显示此日期以及每个库存商品,但我还需要提取其他信息,例如仓库名称。

我正在使用以下表格:

  • 库存:包含库存计数
  • Part_Info:包含零件信息(描述、仓库标识符)
  • Warehouse_Info:包含仓库名称
  • Received_Parts:包含所有收到部件的日志,但没有日期信息。
  • Receive_Master:包含按接收 ID 接收部件的日期。

我的思考过程:

  • 通过 PartID 将 Inventory 加入 Part_Info:这为我提供了零件的详细信息、名称和描述。
  • 通过 WarehouseID 将 Inventory 加入 Warehouse_Info:这将获取仓库名称。

这就是我卡住的地方。

Received_Parts 包含收到的所有零件,但没有日期信息。要获取日期信息,我需要通过 Received_Parts_ID 绑定到 Receive_Master。

我想我可以通过 MAX() 函数获取特定 PartID 的最高receipt_parts_id,然后将其绑定回 Receive_Master 以提取该特定条目的日期。

很遗憾,我所做的每一次加入尝试都失败了。

这是我最近的尝试:

   select 
  a.*,
  b.*,
  c.*,
  d.*,
  e.*
FROM dbo.IN_Inventory a
    LEFT OUTER JOIN dbo.IN_Part b
        ON a.Part_Id = b.part_id
    LEFT OUTER JOIN IN_Warehouse c
        ON a.Warehouse_Id = c.Warehouse_Id
    INNER JOIN IN_Receipt_Parts d
        ON a.Part_Id = d.Part_Id
    INNER JOIN
    (
        SELECT part_id, receipt_id, MAX(receipt_parts_id) maxReceipt
        FROM IN_Receipt_Parts
        GROUP BY Part_Id
    ) e ON d.Part_Id = e.Part_Id AND d.Receipt_Parts_Id = e.maxReceipt
    LEFT OUTER JOIN IN_Receipt f
        ON e.Receipt_Id = f.Receipt_Id
WHERE
    a.On_Hand_New > 0

【问题讨论】:

  • 你能用一些示例数据编写表格模式吗?这样我就可以在本地机器上运行它来测试
  • 这是sql server还是MySql?它们不是一回事,答案可以很大。
  • 向我们展示您的尝试,我们或许可以帮助您解决问题。
  • 这是 SQL Server,对此感到抱歉,我以为我已经正确标记了它(我刚刚修复了它)。到目前为止,这是我尝试过的:
  • 好的,所以不知道如何在 cmets 中发布 sql 脚本。 :(

标签: sql sql-server


【解决方案1】:

我认为这就是您所追求的(您会从派生表中获得日期)。将“DateField”替换为您要查找的日期列。我认为您在最近的尝试中没有提及。

             select 
  a.*,
  b.*,
  c.*,
  e.*
FROM dbo.IN_Inventory a
    LEFT OUTER JOIN dbo.IN_Part b
        ON a.Part_Id = b.part_id
    LEFT OUTER JOIN IN_Warehouse c
        ON a.Warehouse_Id = c.Warehouse_Id
    INNER JOIN
    (
         SELECT p.part_id, m.DateField, Row_Number() OVER (PARTITION BY p.Part_Id ORDER BY m.DateField DESC) RowNumber
        FROM IN_Receipt_Parts p INNER JOIN 
            IN_Receipt  m ON p.receipt_id=m.Receipt_ID 
    ) e ON e.part_id=a.Part_id and RowNumber=1
WHERE
    a.On_Hand_New > 0

【讨论】:

  • 这拉了大约 20 倍的行数,看起来它为收据中的每个 qty 项目拉了一行。
  • 啊,我看到了我在您对 In_receipt_parts(别名 d)的引用中留下的问题。该表中您需要的任何内容都应添加到派生表中。我已经编辑了我的答案以删除它,但您需要添加您需要的任何 add'l 列。 (因为我不知道所有 *s,你需要哪些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多