Динамические расчеты в материализованном виде - PullRequest
3 голосов
/ 12 августа 2011

У меня проблема, я создал материализованное представление, которое работает отлично. Но теперь мне нужно выполнить некоторые расчеты с данными на мой взгляд. Представление содержит рабочее время сотрудников, которые работали в разных проектах. Каждый проект имеет фиксированное количество времени (time_available), в течение которого сотрудник должен завершить проект. Я агрегировал рабочее время в месяц для лучшей презентации. Здесь я хочу выполнить «простое» вычитание «фиксированной суммы за проект» за вычетом «рабочего времени» для сотрудника. Проблема здесь в том, что некоторые проекты имеют продолжительность более одного месяца. Естественно, все мои значения в одном кортеже за каждый месяц. Поэтому, когда у меня есть 3 месяца рабочего времени для проекта, мой взгляд выглядит следующим образом:

MV_Working_Hours:

Project --- Time_Available --- DATE --- Employee --- Working Days
Project A --- 50 Days --- 2011-05 --- Mr. A --- 15 Days
Project A --- 50 Days --- 2011-06 --- Mr. A --- 16 Days
Project A --- 50 Days --- 2011-07 --- Mr. A --- 16 Days

Что я хочу сделать, это рассчитать оставшиеся дни, как это:

Project --- Time_Available --- DATE --- Employee --- Working d in Month ---remaining days
Project A --- 50 Days --- 2011-05 --- Mr. A --- 15 Days --- 35 Days
Project A --- 50 Days --- 2011-06 --- Mr. A --- 16 Days --- 19 Days <--- I get here 34 which is for my need wrong !!!
Project A --- 50 Days --- 2011-07 --- Mr. A --- 16 Days --- 3 Days

Есть ли способ реализовать это с помощью "просто" sql или мне нужно использовать pl / sql в OWB? Я использую OWB версии 11gR2

ТНХ

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Вы должны иметь возможность использовать аналитические функции для генерации промежуточного итога.Что-то вроде

SELECT project,
       time_available,
       date_column,
       employee,
       working_days_in_month,
       time_available - 
         sum(working_days) over (partition by project 
                                     order by date) remaining_days
  FROM mv_working_hours
2 голосов
/ 12 августа 2011

Вы должны быть в состоянии сделать это с аналитическими функциями SQL.

11gR2 http://download.oracle.com/docs/cd/E14072_01/server.112/e10810/analysis.htm

SUM( "Working Days" )
  OVER (PARTITION BY "Project", "Employee"
  ORDER BY "DATE" 
  ROWS UNBOUNDED PRECEDING)

Вы сможете вычесть это из "Time_Available" (у вас будет возможность вернуть отрицательные значения, замена их нулями может быть обработана и в SQL)


Кстати, я не могу помочь, но мне нравится ваш выбранный заголовок для результата ... "reaming days"

В зависимости от проекта г-н А. может счесть, что заголовок столбца является уместным и обоснованным.

...