【问题标题】:How to use case statement based on for loop in oracleoracle中如何使用基于for循环的case语句
【发布时间】:2017-07-18 06:21:34
【问题描述】:

我的源数据是这样的——看图片here

现在我正在尝试根据 OFFSET_PERIOD_FROM 为 PORTFOLIO_GROUP、PORTFOLIO_REGION、LIMIT_NAME 的每个唯一组合计算 START_DATE_ID。为此,我在 select 语句中使用了这个 case 语句

CASE 
OFFSET_PERIOD_FROM = 0 THEN TRUNC(SYSDATE, 'Q')
OFFSET_PERIOD_FROM = 1 THEN ADD_MONTHS(TRUNC(SYSDATE, 'Q'),3)
OFFSET_PERIOD_FROM = 2 THEN ADD_MONTHS(TRUNC(SYSDATE, 'Q'),6) -- 6 is multiple of 3 and so on
OFFSET_PERIOD_FROM = 3 THEN ADD_MONTHS(TRUNC(SYSDATE, 'Q'),9)
OFFSET_PERIOD_FROM = 4 THEN ADD_MONTHS(TRUNC(SYSDATE, 'Q'),12)
OFFSET_PERIOD_FROM = 5 THEN ADD_MONTHS(TRUNC(SYSDATE, 'Q'),15)
END AS START_DATE_ID

现在我的问题是,对于 PORTFOLIO_GROUP、PORTFOLIO_REGION、LIMIT_NAME 的每个组合,OFFSET_PERIOD_FROM 的值不限于 5。

那么如何为 PORTFOLIO_GROUP、PORTFOLIO_REGION、LIMIT_NAME 的每个组合运行这个 case 语句,例如 0..max(OFFSET_PERIOD_FROM)

【问题讨论】:

  • 类似ADD_MONTHS(TRUNC(SYSDATE, 'Q'), OFFSET_PERIOD_FROM * 3)? (未经测试)

标签: sql oracle plsql oracle11g


【解决方案1】:

如果ADD_MONTHS 的第二个参数总是3*OFFSET_PERIOD_FROM,那么你可以使用

SELECT ADD_MONTHS(TRUNC(SYSDATE, 'Q'),3*OFFSET_PERIOD_FROM) AS START_DATE_ID
    FROM Yourtable;

否则使用,

SELECT ADD_MONTHS(TRUNC(SYSDATE, 'Q'),b.months_to_add) AS START_DATE_ID
        FROM Yourtable a,
(
  select DISTINCT OFFSET_PERIOD_FROM ,months_to_add FROM Yourtable 
) b WHERE 
a.OFFSET_PERIOD_FROM = b.OFFSET_PERIOD_FROM;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2014-10-18
    • 2015-12-05
    • 2021-10-01
    相关资源
    最近更新 更多