最近的交易日期针对工程订单?

时间:2018-01-24 16:22:52

标签: sql sql-server

提前道歉可能是一个非常愚蠢的问题,但是在使用Crystal Reports多年后,我一直在使用Google自学SQL。

我们有工作订单,可能有很多针对他们的交易。我想找到最新的一个,并根据Works订单号(这是一个唯一的ID)返回它?我试图使用MAX,但只返回该记录的交易日期。

我认为我的挣扎可能是因为对SQL中的分组缺乏了解。在Crystal中,它只是选择分组的内容'但由于某些原因,在SQL中我似乎被迫按所有选定的字段进行分组。

我的最终目标是能够比较工程订单的计划结束日期("我们需要在当时完成此工作")与最后一笔交易是根据工程订单进行预订时,我可以创建一个OTIF KPI。

我附上了我目前在SQL Server 2014 Management Studio中看到的内容的图片,以及我在查询中的尝试。

SELECT wip.WO.WO_No
     , wip.WO.WO_Type
     , stock.Stock_Trans_Log.Part_No
     , stock.Stock_Trans_Types.Description
     , stock.Stock_Trans_Log.Qty_Change
     , stock.Stock_Trans_Log.Trans_Date
     , wip.WO.End_Date
     , wip.WO.Qty - wip.WO.Qty_Stored AS 'Qty remaining'
     , MAX(stock.Stock_Trans_Log.Trans_Date) AS 'Last Production Receipt'

FROM stock.Stock_Trans_Log 
INNER JOIN production.Part 
ON stock.Stock_Trans_Log.Part_No = production.Part.Part_No 
INNER JOIN wip.WO 
ON stock.Stock_Trans_Log.WO_No = wip.WO.WO_No 
INNER JOIN stock.Stock_Trans_Types 
ON stock.Stock_Trans_Log.Tran_Type = stock.Stock_Trans_Types.Type
WHERE (stock.Stock_Trans_Types.Type = 10) 
AND (stock.Stock_Trans_Log.Store_Code <> 'BI')
GROUP BY wip.WO.WO_No
       , wip.WO.WO_Type
       , stock.Stock_Trans_Log.Part_No
       , stock.Stock_Trans_Types.Description
       , stock.Stock_Trans_Log.Qty_Change
       , stock.Stock_Trans_Log.Trans_Date
       , wip.WO.End_Date
       , wip.WO.Qty - wip.WO.Qty_Stored
HAVING (stock.Stock_Trans_Log.Part_No BETWEEN N'2Z' AND N'9A')

Query + results

1 个答案:

答案 0 :(得分:0)

如果我的释义是正确的,你可以使用以下几行内容......

WITH
  sequenced_filtered_stock_trans_log AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY WO_No
                           ORDER BY Trans_Date DESC)   AS reversed_sequence_id
  FROM
    stock.Stock_Trans_Log
  WHERE
        Type        = 10
    AND Store_Code <> 'BI'
    AND Part_No    BETWEEN N'2Z' AND N'9A'
)
SELECT
  <stuff>
FROM
  sequenced_filtered_stock_trans_log   AS stock_trans_log
INNER JOIN
  <your joins>
WHERE
  stock_trans_log.reversed_sequence_id = 1

首先,这将应用WHERE子句来过滤日志表。

应用WHERE子句后,计算序列ID。从每个分区(每个WO_No重新启动,并从最高Trans_Date开始。

最后,可以在外部查询中使用WHERE子句,该子句指定您只需要序列ID为1的记录,这是最新的WO_No行。该表的其余连接将正常进行。

如果还有任何其他过滤(通过加入或任何其他方式)应该完成 之前 应用程序ROW_NUMBER()