【问题标题】:Oracle View not working correctly using Case when conditionOracle View 在条件下使用 Case 时无法正常工作
【发布时间】:2020-12-07 19:49:48
【问题描述】:

对于M_DESCR 字段,当altype = 'Cash total' 时,我尝试将值设置为'C',当altype = 'Other total' 时,我希望将值设置为'O',否则它应该是null。当我尝试在我的第一个 union all 条件中执行相同操作时,字段 M_DESCR 没有任何更改。

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

【问题讨论】:

  • 您的观点存在根本性的错误。 1.表is_test中没有allocationassettype = 'Cash total' llocationassettype = 'Other total'的值。 2. 第二个和第三个联合只给出一行,所有字段都为空值。 3. 我假设您正在尝试访问第一个联合中的第二个和第三个联合的结果,这是不可能的。您能否澄清这些要点并添加预期的结果输出。 4.删除ALLOCATIONASSETTYPE应该不是问题。
  • 实际上,正如您从第一个 UNION 看到的那样,我只是获取所有字段,在第二个联合和第三个联合中,我分别添加了额外的两行“现金总计”和“其他总计”,其中一些一种目前工作正常的计算......我只想在完成所有计算后删除 ALLOCATIONASSETTYPE,因为我正在使用这个字段......
  • 如果你这么说第二个和第三个没问题,使用一级子查询应该是你应该做的,不应该尝试在第一个联合中访问它,这在逻辑上没有意义。
  • 你能告诉我具体怎么做吗?
  • ALLOCATIONASSETTYPE 是来自基础表 IS_TEST 的列。因此,您可以简单地将其从视图 IS_ID 的投影中删除,而不会影响您在视图的内部逻辑中引用它的能力。但是,您使用 ALLOCATIONASSETTYPE 来识别 Cash totalOther total 汇总行,因此看来您确实需要视图投影中的列。简而言之,根本不清楚您要达到的目标。

标签: sql oracle group-by view case-when


【解决方案1】:

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

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
);

【讨论】:

  • 它抱怨第三个工会没有按表达式分组,其中 WHEN allocationassettype = 'Cash total'
  • 不应该。检查这个小提琴dbfiddle.uk/…
  • 我没有修改第二个和第三个联合的逻辑,而只是将第一个联合以及第二个和第三个添加到 from 子句中,以便我们可以访问allocationassettype ,正如您在原始问题中提到的那样
  • 有一个问题很抱歉我没有在问题中提到...每个标识符的以下字段值是重复的,需要添加现金总额和其他总额字段,但我们需要制作确定 group by 只需要 Identifier 字段否则会影响计算逻辑...不确定我们是否需要为此添加另一个联合? IMPORT_DATE、EFFECTIVE_DATE、FUND_QUOTE_CRNY、MEMBER_QUOTE_CRNY、MEMBER_QTY_TYPE、FORCE_FLAG、
  • 如果你说它总是按照联合 2 和联合 3 中的相应组重复,那么只需对你提到的所有字段使用 max() 即可。 (唯一的问题是MEMBER_DESCR 在第二个联合分组中的作用是什么)
【解决方案2】:

我认为创建的视图没有任何问题。您可以简单地从选择列表和查看列列表中删除 ALLOCATIONASSETTYPE 列。

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

**

allocationassettype = '现金总额', 当 allocationassettype = '其他 总计'

**

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2013-08-26
    相关资源
    最近更新 更多