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

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

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

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))...

person user2766426    schedule 11.05.2015    source источник
comment
Вы переходите с PostgreSQL на... MySQL, SQL Server, Oracle?   -  person Giorgos Betsos    schedule 12.05.2015
comment
SQL не является продуктом СУБД. Это язык запросов, используемый всеми реляционными СУБД.   -  person a_horse_with_no_name    schedule 12.05.2015
comment
@GiorgosBetsos: в качестве примечания: Progress — это не то же самое, что PostgreSQL   -  person a_horse_with_no_name    schedule 12.05.2015


Ответы (1)


Если вы переходите на 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

person Giorgos Betsos    schedule 11.05.2015