2014-07-11 1 views
0

У нас есть проблема с использованием аналитической функции в Oracle.Как вычислить квоту с аналитической функцией по строке?

Мы хотим вычислить столбец else_quota из других столбцов. Наши данные сгруппированы по branch_id и region_id. Каждая ветвь и область имеют значение квоты (пример 1077). Если значение квоты больше значения still_quota, мы не изменяем значение else_quota.

Надеюсь, следующий пример был описательным.

enter image description here

Мы создали запрос для расчета 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 

enter image description here

Пожалуйста, помогите нам справиться с этой проблемой.

Благодаря ...

УЛУЧШИТЬ:

На самом деле, я отбрасываются некоторые столбцы из таблицы из-за уменьшения сложности запросов.

Наша тестовая таблица имеет эти столбцы.

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 

enter image description here

ответ

2

Похоже, основной запрос:

SELECT CUSTOMER_NUM, BRANCH_ID, REGION_ID, TOTAL_QUOTA, QUOTA, 
     TOTAL_QUOTA - SUM(QUOTA) 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; 

Замечу, что order by положения не являются стабильными, потому что есть дубликаты. Было бы неплохо иметь некоторые другие столбцы, такие как значение id или datetime, которое действительно сделало бы упорядочение согласованным.

Ваш, похоже, беспокоит отрицательные остающиеся квоты. Обращайтесь с этим после расчет.Просто используйте функцию greatest():

SELECT CUSTOMER_NUM, BRANCH_ID, REGION_ID, TOTAL_QUOTA, QUOTA, 
     GREATEST(0, 
       TOTAL_QUOTA - SUM(QUOTA) 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; 
+0

10 thx для ответа. Но вашего ответа недостаточно для решения реальной проблемы. Я улучшил свой вопрос. Посмотрите на это – neverwinter

Смежные вопросы