2009-09-30 2 views
0

Это недоработанный запрос, который я пытаюсь упростить, но я в недоумении. В основном мы смотрим на таблицы Dynamics-SL (Solomon), чтобы определить, что-то еще отправлено или нет. Часто люди вводят количество как отправленное, но обработка событий неверна, поскольку она фактически не покидала склад. Поэтому мы смотрим на таблицу SOEvent для элементов с типом «NPAK» или «PINV», а затем сравниваем количество, отправленное в таблице SOShipLine ... Проблема в том, что мы делаем это снова в предложении WHERE, поэтому мы заканчиваем этим супер длинный запрос, который я должен думать, может быть упрощен, здесь (TIA):Упростите многократное использование одной и той же последовательности CASE WHEN

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 форматирование ... –

+0

В основном потому, что я просто использовал 4-пространства-тир ID ее как код вместо тегов. Сожалею. – maczealot

ответ

1

сдирать где п и сделать верхнюю часть в качестве подзапроса.

Затем вы можете использовать предложение 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

Смежные вопросы