这是一个表现不佳的查询,我一直在试图简化但不知所措。基本上我们正在研究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