长话短说,我得到了这个查询(对论坛世界进行了一些编辑)以使其能够正常工作,从而开始创建报告。 3个CASE语句存在一些问题(试图在代码中添加注释以更好地解释正在发生的事情)。所有数据都从同一表/视图中提取。
我知道我需要创建一些嵌套的SELECT语句才能使其正常工作,但是我很挣扎。我想要发生的是...
CASE 2仅在CASE 1不为NULL的情况下运行,该列将是(amd_month + 1 month)的结果。格式为YYYYMM
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
任何帮助都会很棒。谢谢!
答案 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
...
将日期数据类型存储为日期或时间戳时,日期算术比将字符串存储为日期时好得多。