У нас есть проблема с использованием аналитической функции в Oracle.Как вычислить квоту с аналитической функцией по строке?
Мы хотим вычислить столбец else_quota из других столбцов. Наши данные сгруппированы по branch_id и region_id. Каждая ветвь и область имеют значение квоты (пример 1077). Если значение квоты больше значения still_quota, мы не изменяем значение else_quota.
Надеюсь, следующий пример был описательным.
Мы создали запрос для расчета remaining_quota с суммой по перегородке функциями, но мы не смогли.
Пример запроса и результат
SELECT CUSTOMER_NUM, BRANCH_ID, REGION_ID, TOTAL_QUOTA, QUOTA,
TOTAL_QUOTA -
SUM (CASE
WHEN TOTAL_QUOTA - QUOTA < 0
THEN 0
ELSE QUOTA
END) OVER (PARTITION BY BRANCH_ID, REGION_ID ORDER BY BRANCH_ID,
REGION_ID,DESC)
AS REMAINING_QUOTA
FROM MY_TABLE
WHERE BRANCH_ID = 723 AND REGION_ID = 822
ORDER BY BRANCH_ID,
REGION_ID DESC
Пожалуйста, помогите нам справиться с этой проблемой.
Благодаря ...
УЛУЧШИТЬ:
На самом деле, я отбрасываются некоторые столбцы из таблицы из-за уменьшения сложности запросов.
Наша тестовая таблица имеет эти столбцы.
CUSTOMER_NUM NUMBER,
BRANCH_ID NUMBER,
ACCOUNT_NUM NUMBER,
TOTAL_QUOTA NUMBER,
QUOTA NUMBER,
REGION_ID NUMBER,
LOB_CODE NUMBER,
ESTIMATED_END_DATE DATE,
TOTAL_AMOUNT NUMBER
Мы создаем структуру данных этой таблицы в SQLFiddle. Ссылка: http://sqlfiddle.com/#!4/94fe4/1/0
Мой первоначальный сбой запроса:
SELECT CUSTOMER_NUM, BRANCH_ID, REGION_ID,LOB_CODE,ESTIMATED_END_DATE,TOTAL_AMOUNT, TOTAL_QUOTA, QUOTA,
TOTAL_QUOTA -
SUM (CASE
WHEN TOTAL_QUOTA - QUOTA < 0
THEN 0
ELSE QUOTA
END) OVER (PARTITION BY BRANCH_ID, REGION_ID, LOB_CODE ORDER BY BRANCH_ID,
REGION_ID,
LOB_CODE,
ESTIMATED_END_DATE,
TOTAL_AMOUNT DESC)
AS REMAINING_QUOTA
FROM TEST_TABLE
WHERE BRANCH_ID = 723 AND REGION_ID = 822
AND LOB_CODE = 934
ORDER BY BRANCH_ID,
REGION_ID,
LOB_CODE,
ESTIMATED_END_DATE,
TOTAL_AMOUNT DESC
Я изменил запрос решение, которое включает в себя НАИБОЛЬШИЙ функцию. Но этого нам недостаточно. Если эта функция будет отрицательной, если вы оставите эту квоту, это значение будет равным нулю. Однако, если оставшаяся квота отрицательная, мы не хотим уменьшать значение квоты. Это значение должно оставаться таким же.
Мы хотим, чтобы получить результат, как следующий запрос: (Мы добавляем «или QUOTA между 471 и 472» строка для правильного результата Существует не ряд, таким образом, на самом деле.)
SELECT CUSTOMER_NUM, BRANCH_ID, REGION_ID,LOB_CODE,ESTIMATED_END_DATE,TOTAL_AMOUNT, TOTAL_QUOTA, QUOTA,
TOTAL_QUOTA -
SUM (CASE
WHEN TOTAL_QUOTA - QUOTA < 0
or QUOTA between 471 and 472
THEN 0
ELSE QUOTA
END) OVER (PARTITION BY BRANCH_ID, REGION_ID, LOB_CODE ORDER BY BRANCH_ID,
REGION_ID,
LOB_CODE,
ESTIMATED_END_DATE,
TOTAL_AMOUNT DESC)
AS REMAINING_QUOTA
FROM TEST_TABLE
WHERE BRANCH_ID = 723 AND REGION_ID = 822
AND LOB_CODE = 934
ORDER BY BRANCH_ID,
REGION_ID,
LOB_CODE,
ESTIMATED_END_DATE,
TOTAL_AMOUNT DESC
10 thx для ответа. Но вашего ответа недостаточно для решения реальной проблемы. Я улучшил свой вопрос. Посмотрите на это – neverwinter