我今天早上试图将头缠住。

我想展示 inventory 零件的状态(对于我们的产品),只有当我尝试返回所有零件时,此查询才变得复杂。

让我布置:

  • 单个表 inventoryReport
  • 我有一个不同的X零件列表,其结果必须是行的x#(每部分1行显示最新的库存条目)。
  • 表由库存更改的过时条目组成(因此,我只需要 LATEST 每个部分的日期输入)。
  • 该表中包含的所有数据,因此无需加入。

目前,这很简单,我可以通过执行以下SQL(为您提供一些想法)来实现这一目标:

SELECT     TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty
FROM         inventoryReport
WHERE     (ldPart = 'ABC123')
ORDER BY ldDate DESC

这使我获得了我的前1行,每零件如此简单,但是我需要显示所有X(假设30个部分)。因此,我需要30行,结果。当然,简单的解决方案将是在我的代码中循环x#sql调用(但这是昂贵的),这足够了,但是为此,我很乐意使用此SQL来工作,以减少x##调用DB (如果不需要),只需查询1个查询。

根据我在这里看到的内容,我需要在寻找结果集时以某种方式跟踪每个项目的最新日期。

我最终会做

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)

限制我需要的零件。希望我能够清楚地解决我的问题。让我知道您是否有主意。我不能做 DISTINCT 由于行不相同,因此日期需要是最新的,我最多需要x行。

想法?我卡住了...

有帮助吗?

解决方案

编辑: :确保测试每个解决方案的性能。正如指出 这个问题, ,CTE方法可以使用ROW_NUMBER胜过表现。

;with cteMaxDate as (
    select ldPart, max(ldDate) as MaxDate
        from inventoryReport
        group by ldPart
)
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty
    FROM cteMaxDate md
        INNER JOIN inventoryReport ir
            on md.ldPart = ir.ldPart
                and md.MaxDate = ir.ldDate

其他提示

  SELECT *
  FROM   (SELECT i.*,
      ROW_NUMBER() OVER(PARTITION BY ldPart ORDER BY ldDate DESC) r
      FROM   inventoryReport i
      WHERE  ldPart in ('ABC123', 'BFD21', 'AA123', etc)
         )
  WHERE  r = 1

您需要加入一个子问题:

SELECT i.ldPart, x.LastDate, i.inAbc
FROM inventoryReport i
INNER JOIN (Select ldPart, Max(ldDate) As LastDate FROM inventoryReport GROUP BY ldPart) x
on i.ldPart = x.ldPart and i.ldDate = x.LastDate
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top