Представление Oracle работает некорректно с использованием Case when condition

#sql #oracle #&roup-by #view #case-when

#sql #Oracle #группировка по #Вид #случай, когда

Вопрос:

Для M_DESCR поля я пытаюсь указать значение как 'C' когда altype = 'Cash total' , когда altype = 'Other total' тогда я хочу, чтобы значение было таким, каким 'O' еще оно должно быть null . Когда я пытаюсь сделать то же самое в моем первом union all условии, для поля ничего не было изменено M_DESCR .

Также я хочу удалить поле ALTYPE из поля зрения в конце, когда все вычисления будут выполнены, но не знаю, как это сделать.

Комментарии:

1. В вашем представлении есть какая-то фундаментальная ошибка. 1. В таблице allocationassettype = 'Cash total' отсутствует значение as llocationassettype = 'Other total' или is_test . 2. второе и третье объединение дает только одну строку со всеми полями, имеющими нулевое значение. 3. Я предполагаю, что вы пытаетесь получить доступ к результату 2-го и 3-го объединения в 1-м объединении, что невозможно. Не могли бы вы уточнить эти моменты и также добавить ожидаемый результат вывода. 4. Удаление ALLOCATIONASSETTYPE не должно быть проблемой.

2. на самом деле, как вы можете видеть из первого объединения, я просто беру все поля, а во втором объединении и третьем объединении я добавляю дополнительные две строки с ‘Cash Total’ и ‘Other Total’ соответственно с некоторыми вычислениями, которые в настоящее время работают нормально …. я хочу удалить ALLOCATIONASSETTYPE только после выполнения всех вычислений, поскольку я использую это поле для того же самого…

3. Если вы так говорите, со вторым и третьим все в порядке, все в порядке, использование подзапроса одного уровня должно соответствовать тому, что вы делаете, и не должно пытаться получить к нему доступ в первом объединении, что логически не имеет смысла.

4. можете ли вы точно сказать, как это сделать?

5. ALLOCATIONASSETTYPE — это столбец из базовой таблицы IS_TEST. Таким образом, вы могли бы просто удалить его из проекции представления IS_ID, не влияя на вашу способность ссылаться на него во внутренней логике представления. Однако вы используете ALLOCATIONASSETTYPE для идентификации Cash total и Other total сводных строк, поэтому, похоже, вам все-таки нужен столбец в проекции представления. Короче говоря, совсем не ясно, чего вы пытаетесь достичь.

Ответ №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
);
  

Комментарии:

1. он жалуется на то, что не группируется по выражению для третьего объединения, где, КОГДА allocationassettype = ‘Общая сумма денежных средств’

2. Этого не должно быть. проверьте эту скрипку dbfiddle.uk /…

3. Я не изменял логику для второго и третьего объединения, а просто добавил первое объединение вместе со вторым и третьим в предложение from, чтобы мы могли получить доступ allocationassettype , как вы упомянули в своем первоначальном вопросе

4. есть одна проблема, извините, я не упомянул в вопросе … ниже приведены значения полей для каждого идентификатора, которые повторяются и должны быть добавлены также для cash total и другого поля total, но нам нужно убедиться, что &roup by нужна только для поля Identifier, иначе это повлияет на логику вычисления … не уверены, нужно ли нам добавить другое объединение для этого? IMPORT_DATE, EFFECTIVE_DATE, FUND_QUOTE_CRNY, MEMBER_QUOTE_CRNY, MEMBER_QTY_TYPE, FORCE_FLAG,

5. Если вы говорите, что оно всегда повторяется в соответствии с соответствующей группой by в объединении 2 и объединении 3 соответственно, тогда просто используйте max () для всех упомянутых вами полей. (остается только вопрос, какова роль MEMBER_DESCR во 2-м объединении группы по предложению)

Ответ №2:

Я не вижу никаких проблем с созданным представлением. Вы можете просто удалить столбец ALLOCATIONASSETTYPE из списка выбора и просмотреть список столбцов.

В тестовом примере я не вижу никакого значения, как описано вами:

**

allocationassettype = ‘Общая сумма наличных’, когда allocationassettype = ‘Другая сумма’

**