使用 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
);
对于 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
);