Вложенные операторы SELECT и CASE в одной таблице - PullRequest
0 голосов
/ 04 декабря 2018

Короче говоря, мне передали этот запрос (немного отредактированный для мира форума), чтобы он заработал, чтобы начать создавать отчеты.Возникли некоторые проблемы с 3 операторами CASE (попытался добавить комментарий в код, чтобы немного лучше объяснить, что происходит).Все данные извлекаются из одной и той же таблицы / представления.

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

  1. CASE 2 запускался только в том случае, если CASE 1 NOT NULL, где столбец будет результатом (amd_month + 1 month),Формат: ГГГГММ

  2. CASE 3, запускаемый только в том случае, если CASE 2 NOT NULL, где столбец будет результатом (ext_srg_start_date + 6 месяцев).Формат: ГГГГММ

    SELECT
    part,
    amd_month,
    amd   actual_demand,
    round(roll_12amd * 1.15) srg_lmt,
    round(roll_12amd * 1.5) ext_srg_lmt,
    -- CASE: 1 
    -- calculate level- COMPLETE
    CASE
    WHEN (amd > roll_12amd * 1.5) THEN 'Extreme Surge'
    WHEN (amd > roll_12amd * 1.15) THEN 'Surge'
    ELSE NULL
    END AS srg_nt,
    -- CASE: 2
    -- if amd_month = 12, (+1 year to) and (-11 from month) from ext_srg_start_date, 
    -- else +1 month to ext_srg_start_date - COMPLETE
    CASE
    WHEN substr(amd_month, 5, 2) IN (
        '12'
    ) THEN concat(TO_CHAR(substr(amd_month, 1, 4) + 1), lpad(TO_CHAR(substr(amd_month, 5, 2) - 11), 2, '0'))
    ELSE concat(substr(amd_month, 1, 4), lpad(TO_CHAR(substr(amd_month, 5, 2) + 1), 2, '0'))
    END AS ext_srg_start_date,
    ---- CASE: 3
    ---- +6 to ext_srg_start_date - IN PROGRESS
    CASE
    WHEN substr(amd_month, 5, 2) IN (
        '01',
        '02',
        '03',
        '04',
        '05',
        '06'
    ) THEN concat(substr(amd_month, 1, 4), lpad(TO_CHAR(substr(amd_month, 5, 2) + 6), 2, '0'))
    ELSE concat(TO_CHAR(substr(amd_month, 1, 4) + 1), lpad(TO_CHAR(substr(amd_month, 5, 2) - 6), 2, '0'))
    END AS ext_srg_carry_date
    FROM
    connect.table
    

Любая помощь будет отличной.Спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете покончить с инструкциями дел 2 и 3, если AMD_Month является типом данных даты, вы также можете покончить с ними, если это не так, но для этого требуется дополнительный шаг:

Если AMD_Month является столбцом Dateтогда ext_srg_start_date и ext_srg_carry_date могут быть определены как:

...
, AMD_Month + INTERVAL '1' MONTH ext_srg_start_date
, AMD_Month + INTERVAL '6' MONTH ext_srg_carry_date
...

Если AMD_Month является строкой, то сначала вам нужно преобразовать ее в дату, и я думаю, что затем преобразовать результат обратно в строку:

...
, TO_CHAR( TO_DATE( AMD_Month, 'YYYYMM')
         + INTERVAL '1' MONTH, 'YYYYMM') ext_srg_start_date
, TO_CHAR( TO_DATE( AMD_Month, 'YYYYMM')
         + INTERVAL '6' MONTH, 'YYYYMM') ext_srg_carry_date
...

Арифметика даты работает намного лучше, когда вы сохраняете типы данных даты как даты или метки времени, чем когда вы сохраняете их как строки.

...