這是一個表現不佳的查詢,我一直在試圖簡化但不知所措。基本上我們正在研究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)
這是一些格式化的fugly ... – 2009-09-30 19:22:26
主要是因爲我只用了4空間縮進到ID爲代碼,而不是標籤。抱歉。 – maczealot 2009-09-30 19:51:05