提前道歉可能是一个非常愚蠢的问题,但是在使用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')
答案 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()
。