2009-09-30 48 views
0

这是一个表现不佳的查询,我一直在试图简化但不知所措。基本上我们正在研究Dynamics-SL(Solomon)表格以确定是否已经发货。通常人们在发货时输入数量,但事件处理不正确,因为它实际上并未离开仓库。因此,我们查看SOEvent表中是否有'NPAK'或'PINV'类型的项目,然后与SOShipLine表中的数量进行比较......问题是我们在WHERE子句中再次执行此操作,因此我们最终得到了这个超级我得想长的查询可以简化,这里是(TIA):简化多次使用相同的CASE当序列

SELECT  

SOHeader.OrdNbr, 
SOHeader.CustID, 
SOHeader.User9 AS ShipDate, 
SOLine.LineRef, 
SOLine.InvtID, 
SOLine.QtyOrd, 

CASE WHEN SOShipHeader.InvcNbr = '' THEN 

CASE WHEN (
      SELECT MIN(EventTime) 
      FROM Solomon_SOEvent SOEvent WITH (NOLOCK) 
      WHERE (SOEvent.EventType = 'NPAK' OR SOEvent.EventType = 'PINV') 
      AND SOEvent.OrdNbr = SOHeader.OrdNbr) IS NULL 
THEN 0 

ELSE (
     SELECT MAX(SOShipLine.QtyShip) 
     FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
     WHERE SOShipLine.InvtID = SOLine.InvtID 
     AND SOShipLine.SiteID = SOLine.SiteID 
     AND SOShipHeader.ShipperID = SOShipLine.ShipperID 
     ) 
END 

ELSE 
    ISNULL(
     (SELECT MAX(SOShipLine.QtyShip) 
     FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
     WHERE SOShipLine.InvtID = SOLine.InvtID 
     AND SOShipLine.SiteID = SOLine.SiteID 
     AND SOShipHeader.ShipperID = SOShipLine.ShipperID) 
,0) 

END 

AS QtyShip_Corrected, 

ISNULL(
    (SELECT MAX(SOShipLine.QtyShip) 
    FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
    WHERE SOShipLine.InvtID = SOLine.InvtID 
    AND SOShipLine.SiteID = SOLine.SiteID 
    AND SOShipHeader.ShipperID = SOShipLine.ShipperID) 
    ,0) 

AS SOShipLineQtyShip, 

QtyShip 

FROM Solomon_SOHeader SOHeader WITH (NOLOCK) 
INNER JOIN Solomon_SOLine SOLine WITH (NOLOCK) ON SOHeader.OrdNbr = SOLine.OrdNbr 
INNER JOIN Solomon_SOShipHeader SOShipHeader WITH (NOLOCK) ON SOShipHeader.OrdNbr = SOHeader.OrdNbr 
AND SOShipHeader.Cancelled = 0 

WHERE SOHeader.Status = 'O' 
AND SOLine.QtyShip > 0 
AND CASE WHEN SOShipHeader.InvcNbr = '' 

THEN 

CASE WHEN (
     SELECT  MIN(EventTime) 
     FROM Solomon_SOEvent SOEvent WITH (NOLOCK) 
     WHERE (SOEvent.EventType = 'NPAK' OR SOEvent.EventType = 'PINV') 
     AND SOEvent.OrdNbr = SOHeader.OrdNbr) IS NULL 
THEN 0 

    ELSE (
      SELECT MAX(SOShipLine.QtyShip) 
      FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
      WHERE SOShipLine.InvtID = SOLine.InvtID 
      AND SOShipLine.SiteID = SOLine.SiteID 
      AND SOShipHeader.ShipperID = SOShipLine.ShipperID 
     ) 
    END 
ELSE 

    ISNULL(
      (SELECT MAX(SOShipLine.QtyShip) 
      FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
      WHERE SOShipLine.InvtID = SOLine.InvtID 
      AND SOShipLine.SiteID = SOLine.SiteID 
      AND SOShipHeader.ShipperID = SOShipLine.ShipperID) 
     ,0) 

END 

    <> ISNULL(
      (SELECT MAX(SOShipLine.QtyShip) 
      FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
      WHERE SOShipLine.InvtID = SOLine.InvtID 
      AND SOShipLine.SiteID = SOLine.SiteID 
      AND SOShipHeader.ShipperID = SOShipLine.ShipperID) 
    ,0) 
+0

这是一些格式化的fugly ... – 2009-09-30 19:22:26

+0

主要是因为我只用了4空间缩进到ID为代码,而不是标签。抱歉。 – maczealot 2009-09-30 19:51:05

回答

1

剥去where子句并做顶部为子查询。

然后,您可以对列名使用where子句。事情是这样的:

select * 
from (
    SELECT  
     SOHeader.OrdNbr, 
     SOHeader.CustID, 
     SOHeader.User9 AS ShipDate, 
     SOLine.LineRef, 
     SOLine.InvtID, 
     SOLine.QtyOrd, 

     CASE WHEN SOShipHeader.InvcNbr = '' THEN 
      CASE WHEN (
          SELECT MIN(EventTime) 
          FROM Solomon_SOEvent SOEvent WITH (NOLOCK) 
         WHERE (SOEvent.EventType = 'NPAK' OR SOEvent.EventType = 'PINV') 
         AND SOEvent.OrdNbr = SOHeader.OrdNbr) IS NULL 
       THEN 0 

       ELSE (
         SELECT MAX(SOShipLine.QtyShip) 
         FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
        WHERE SOShipLine.InvtID = SOLine.InvtID 
        AND SOShipLine.SiteID = SOLine.SiteID 
        AND SOShipHeader.ShipperID = SOShipLine.ShipperID 
        ) 
      END 

      ELSE 
       ISNULL(
        (SELECT MAX(SOShipLine.QtyShip) 
        FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
        WHERE SOShipLine.InvtID = SOLine.InvtID 
        AND SOShipLine.SiteID = SOLine.SiteID 
        AND SOShipHeader.ShipperID = SOShipLine.ShipperID) 
      ,0) 
     END 
     AS QtyShip_Corrected, 

     ISNULL(
      (SELECT MAX(SOShipLine.QtyShip) 
      FROM Solomon_SOShipLine SOShipLine WITH (NOLOCK) 
      WHERE SOShipLine.InvtID = SOLine.InvtID 
      AND SOShipLine.SiteID = SOLine.SiteID 
      AND SOShipHeader.ShipperID = SOShipLine.ShipperID) 
      ,0) 

     AS SOShipLineQtyShip,1 

     QtyShip 

    FROM Solomon_SOHeader SOHeader WITH (NOLOCK) 
    INNER JOIN Solomon_SOLine SOLine WITH (NOLOCK) ON SOHeader.OrdNbr = SOLine.OrdNbr 
    INNER JOIN Solomon_SOShipHeader SOShipHeader WITH (NOLOCK) ON SOShipHeader.OrdNbr = SOHeader.OrdNbr 
    AND SOShipHeader.Cancelled = 0 

    WHERE SOHeader.Status = 'O' 
    AND SOLine.QtyShip > 0 
) a 
where QtyShip_Corrected <> SOShipLineQtyShip 
+0

真棒,谢谢,这正是我正在寻找,但不能把我的手指! – maczealot 2009-09-30 19:31:46

相关问题