Intereting Posts

Вычисляемые поля в SQL-запросе

Недопустимое имя столбца ItemA , ItemB , ItemC , ItemE и ItemE

Я переношу это из Прогресс в SQL и не могу ссылаться на вычисленные поля в запросе. После исследования ошибки, кажется, единственным решением является замена каждого элемента на полное выражение или создание вложенного оператора select. В этом случае, похоже, не работает.

 SELECT OrderQty - (ItemE + ShippedQty) AS ItemA, ((CASE WHEN (ItemA > ItemB AND ItemA > 0) THEN (ItemA - ItemB) ELSE 0 END)) AS ItemC, UnitPrice * ItemC AS ItemD, ((CASE WHEN OnHandQty > (ReservedQty + PickingQty) THEN OnHandQty - (ReservedQty + PickingQty) ELSE 0 END)) AS ItemB, ((CASE WHEN ReservedQty > - 1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END)) AS ItemE, -- Example of enumerated expression that is far to confusing to continue. SELECT OrderQty - (((CASE WHEN ReservedQty > -1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END)) + ShippedQty), ((CASE WHEN (OrderQty - ((CASE WHEN ReservedQty > -1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END)) > ((CASE WHEN OnHandQty > (ReservedQty + PickingQty) THEN OnHandQty - (ReservedQty + PickingQty) ELSE 0 END)) AND (OrderQty - (ItemE + ShippedQty) > 0) THEN (OrderQty - (ItemE + ShippedQty) ELSE 0 END)))), UnitPrice * ((CASE WHEN (ItemA > ItemB AND ItemA > 0) THEN (ItemA - ItemB) ELSE 0 END))... 

    Если вы переходите на SQL Server, вы можете использовать предложения CROSS APPLY для создания псевдонимов для каждого из вычисленных полей:

     SELECT x.ItemA, t.ItemC, UnitPrice * t.ItemC AS ItemD, y.ItemB, z.ItemE FROM mytable CROSS APPLY (SELECT CASE WHEN ReservedQty > - 1 THEN (ReservedQty + PickedQty + PickingQty) ELSE 0 END) z(ItemE) CROSS APPLY (SELECT OrderQty - (ItemE + ShippedQty)) x(ItemA) CROSS APPLY (SELECT CASE WHEN OnHandQty > (ReservedQty + PickingQty) THEN OnHandQty - (ReservedQty + PickingQty) ELSE 0 END) y(ItemB) CROSS APPLY (SELECT CASE WHEN (x.ItemA > y.ItemB AND x.ItemA > 0) THEN (x.ItemA - y.ItemB) ELSE 0 END) AS t(ItemC) 

    Демоверсия SQLFiddle