#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'
отсутствует значение asllocationassettype = '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 = ‘Другая сумма’
**