首页 > 解决方案 > 如何根据 SQL 中的特定条件恢复备用记录?

问题描述

我希望有人能在这方面帮助我。下面的代码带回了链接到所有零件的订单,包括具有复合材料的零件。因此,如果一个集合由左右部分组成,它将带回以RLA结尾的 SKU,这是一个集合,这就是系统所说的组合。

我要做的是编写一个脚本,如果订单在bContainsComposites字段中标记为TRUE,它将带回设置的 SKU 并忽略其他部分,排除RightLeft的记录。

但是,如果订单中的零件/SKU 不是标记为FALSE的复合材料,则恢复该记录。

相关表格和字段如下:

SELECT o.[nOrderID],
oi.[ChannelSKU] AS 'OrderItemSKU',
si.[bContainsComposites]
FROM  [Order] o INNER JOIN
[OrderItem] oi
ON o.[pkOrderID] = oi.[fkOrderID]
LEFT JOIN [StockItem] si
ON  oi.[fkStockItemId] = si.[pkStockItemID]

选择标准需要基于TRUEFALSE[StockItem].bContainsComposites

我目前得到的结果如下表所示。

订单号 OrderItemSKU b包含复合材料
285705 EWS10323A.5 真的
285705 EWS10323 错误的
285706 EWS10575R 错误的
285706 EWS10575A 真的
285706 EWS10575L 错误的
285713 631113591N 错误的

我需要记录如下:

订单号 OrderItemSKU b包含复合材料
285705 EWS10323A.5 真的
285706 EWS10575A 真的
285713 631113591N 错误的

EWS10323A.5 和 EWS10575A 都是复合材料,因此为 TRUE,但 631113591N 不是复合材料,因此为 FALSE。

我需要找到一种基于第二个图解表编写脚本的方法,该表包括该订单的复合零件,但忽略存在复合零件的相同订单的非复合零件。如果订单没有复合部分,我仍然需要它来恢复该记录。

简而言之,我需要写的是这样的东西,但在 SQL 中:

如果 nOrderID 的 COUNT >1 则带回 si.[bContainsComposites] = 1 的记录,否则带回 si.[bContainsComposites] = 0 的记录

标签: sql

解决方案


您似乎想要一个优先级查询。你可以这样做rank()

SELECT oc.*
FROM (SELECT o.nOrderID, oi.ChannelSKU AS OrderItemSKU, si.bContainsComposites,
             RANK() OVER (PARTITION BY o.nOrderID ORDER BY si.bContainsComposites DESC) as seqnum
      FROM [Order] o INNER JOIN
           OrderItem oi
           ON o.pkOrderID = oi.fkOrderID LEFT JOIN
           StockItem si
           ON oi.fkStockItemId = si.pkStockItemID
     ) oc
WHERE seqnum = 1;

推荐阅读