Использовать CASE WHEN в той же команде SELECT? - PullRequest
0 голосов
/ 09 ноября 2018

Простой запрос Select x, y, z from Table содержит «Case when» в выборке.

Это поле оканчивается на «Конец как поле результата».

Я хотел бы использовать это «поле результата» в другой команде как часть той же команды SELECT (команда Dateadd).

SELECT
    PositionDate,
    ISIN,
    Issuer,
    FirstCouponDate,
    TermLength,
    TermUnit,
    CASE
       WHEN TermUnit = 'Years' THEN 'year'
       WHEN TermUnit = 'Months' THEN 'month'
    END AS 'TermUnitRenamed', 
    DATEADD(TermUnitRenamed, TermLength, FirstCouponDate),
FROM
    GIBDataWarehouse.dbo.vw_Positions

1 Ответ

0 голосов
/ 09 ноября 2018

Два предложения на основе предоставленной вами информации: добавьте ELSE значение по умолчанию к вашему CASE заявлению; затем вложите этот запрос в последующий, чтобы вы могли ссылаться на новое созданное поле.

select
    *
    , case 
        when TermUnitRenamed = 'year' then DateAdd(year, TermLength, FirstCouponDate) 
        when TermUnitRenamed = 'month' then DateAdd(month, TermLength, FirstCouponDate) 
        when TermUnitRenamed = 'day' then DateAdd(day, TermLength, FirstCouponDate) 
        end as newDate
    from (
        select
            PositionDate
            , ISIN
            , Issuer
            , FirstCouponDate
            , TermLength
            , TermUnit
            , case
                when TermUnit = 'Years' then 'year'
                when TermUnit = 'Months' then 'month'
                else 'day' -- assumes default 'day' unit
                end AS TermUnitRenamed
        from GIBDataWarehouse.dbo.vw_Positions
) x

Конечно, , вы можете просто применить логику CASE и DATEADD в самом исходном запросе и вообще избежать вложения, если вам не нужно TermUnitRenamed для чего-либо еще.

select
    PositionDate
    , ISIN
    , Issuer
    , FirstCouponDate
    , TermLength
    , TermUnit
    , case
        when TermUnit = 'Years' then DateAdd(year, TermLength, FirstCouponDate) 
        when TermUnit = 'Months' then DateAdd(month, TermLength, FirstCouponDate) 
        else then DateAdd(day, TermLength, FirstCouponDate) -- assumes default 'day' unit
        end AS newDate
from GIBDataWarehouse.dbo.vw_Positions
...