使用 Case when 条件时,Oracle View 无法正常工作

Oracle View not working correctly using Case when condition

对于 M_DESCR 字段,我试图在 altype = 'Cash total' 时将值设为 'C',当 altype = 'Other total' 时,我希望将值设为 'O' 否则它应该是null。当我在我的第一个 union all 条件下尝试做同样的事情时,字段 M_DESCR.

没有任何改变

我还想在所有计算完成后从视图中删除字段 ALTYPE,但不知道该怎么做。

我没有发现创建的视图有任何问题。您可以简单地从 select 列表中删除 ALLOCATIONASSETTYPE 列并查看列列表。

在测试用例中,我看不到您描述的任何值:

**

allocationassettype = 'Cash total', when allocationassettype = 'Other total'

**

根据我的理解,您可能正在寻找类似的东西,(唯一我对您提供的数据集有点怀疑但可能是我错了)

CREATE OR REPLACE VIEW
    IS_ID
    (
        IDENTIFIER,
        IMPORT_DATE,
        EFFECTIVE_DATE,      
        FUND_QUOTE,
        FUND_QUOTE_CRNY,
        FUND_QUOTE_DATE,
        MEMBER_IDENTIFIER,        
        MEMBER_QUOTE_CRNY,
        MEMBER_QTY,
        MEMBER_QTY_TYPE,
        FORCE_FLAG,
        MEMBER_DESCR,
        MEMBER_RATIO,
        MEMBER_MARKETVALUE
    ) AS
SELECT
  IDENTIFIER,
  IMPORT_DATE,
  EFFECTIVE_DATE,      
  FUND_QUOTE,
  FUND_QUOTE_CRNY,
  FUND_QUOTE_DATE,
  MEMBER_IDENTIFIER,
  MEMBER_QUOTE_CRNY,
  MEMBER_QTY,
  MEMBER_QTY_TYPE,
  FORCE_FLAG,
  CASE 
       WHEN allocationassettype = 'Cash total'
       THEN
       'C'
       WHEN allocationassettype = 'Other total'
       THEN
       'O'
       ELSE NULL
  END AS MEMBER_DESCR,
  MEMBER_RATIO,
  MEMBER_MARKETVALUE        
FROM
(
SELECT
    IDENTIFIER,
    IMPORT_DATE,
    EFFECTIVE_DATE,      
    FUND_QUOTE,
    FUND_QUOTE_CRNY,
    FUND_QUOTE_DATE,
    MEMBER_IDENTIFIER,
    MEMBER_QUOTE_CRNY,
    MEMBER_QTY,
    MEMBER_QTY_TYPE,
    FORCE_FLAG,
    MEMBER_DESCR,
    MEMBER_RATIO,
    MEMBER_MARKETVALUE,        
    ALLOCATIONASSETTYPE
FROM
    IS_TEST
WHERE
    ALLOCATIONASSETTYPE != 'Cash'
and MEMBER_IDENTIFIER is not null
UNION ALL
SELECT
    IDENTIFIER,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    SUM(
        CASE
            WHEN allocationassettype = 'Cash'
            THEN member_ratio
            ELSE 0
        END),
    SUM(
        CASE
            WHEN allocationassettype = 'Cash'
            THEN member_marketvalue
            ELSE 0
        END),
    'Cash total'    
FROM
    IS_TEST
GROUP BY
    IDENTIFIER, MEMBER_DESCR
UNION ALL
SELECT
    IDENTIFIER,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
   NULL,
    100 - SUM(
        CASE
            WHEN MEMBER_IDENTIFIER IS NOT NULL
            THEN member_ratio
            ELSE 0
        END) - SUM(
        CASE
            WHEN allocationassettype = 'Cash'
            THEN member_ratio
            ELSE 0
        END),
    SUM(member_marketvalue) - SUM(
        CASE
            WHEN allocationassettype = 'Cash'
            THEN member_marketvalue
            ELSE 0
        END) - SUM(
        CASE
            WHEN MEMBER_IDENTIFIER IS NOT NULL
            THEN member_marketvalue
            ELSE 0
        END),
    'Other total'    
FROM
    IS_TEST
GROUP BY
    IDENTIFIER
);