嵌套在同一表中的SELECT和CASE语句

时间:2018-12-04 16:30:23

标签: sql oracle select subquery case

长话短说,我得到了这个查询(对论坛世界进行了一些编辑)以使其能够正常工作,从而开始创建报告。 3个CASE语句存在一些问题(试图在代码中添加注释以更好地解释正在发生的事情)。所有数据都从同一表/视图中提取。

我知道我需要创建一些嵌套的SELECT语句才能使其正常工作,但是我很挣扎。我想要发生的是...

  1. CASE 2仅在CASE 1不为NULL的情况下运行,该列将是(amd_month + 1 month)的结果。格式为YYYYMM

  2. CASE 3仅在CASE 2不为空的情况下运行,该列将是(ext_srg_start_date + 6个月)的结果。格式为YYYYMM

    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 :(得分:1)

如果AMD_Month是日期数据类型,则可以取消case语句2和3,如果不是,则也可以取消它们,但是需要采取额外的步骤:

如果AMD_Month是“日期”列,则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
...

将日期数据类型存储为日期或时间戳时,日期算术比将字符串存储为日期时好得多。