Сравните данные для определенной c группировки столбцов и обновления на основе критериев - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть таблица со следующей структурой:

Employee  Project Task Accomplishment Score  Year 
John        A       1         5         60   2016     
John        A       1         6         40   2018
John        A       2         3         30   2016
Simon       B       2         0         30   2017
Simon       B       2         4         30   2019
David       C       1         3         20   2015
David       C       1         2         40   2016
David       C       3         0         25   2017
David       C       3         5         35   2017

Я хочу создать представление с Oracle SQLout приведенной выше таблицы, которое выглядит следующим образом:

Employee  Project Task Accomplishment Score  Year UpdateScore Comment
John        A       1         5         60   2016     60
John        A       1         6         40   2018     100     (=60+40)
John        A       2         3         30   2016     30
Simon       B       2         0         30   2017     30
Simon       B       2         4         40   2019     40      (no update because Accomplishement was 0)
David       C       1         3         20   2015     20
David       C       1         2         40   2016     60      (=20+40)
David       C       3         0         25   2017     25
David       C       3         5         35   2017     35      (no update because Accomplishement was 0)

Группировка: Employee-Project-Task.

Правило столбца UpdateScore:

Если для определенного c Employee-Project-Task group значение столбца выполнения превышает 0 за предыдущий год добавьте счет предыдущего года к последнему году для той же группы «Сотрудник-проект-задача».

Например: John-A-1 - это группа, которая отличается от John-A-2 , Таким образом, как мы видим для John-A-1, достижение составляет 5 (что больше 0) в 2016 году, поэтому мы добавляем счет 2016 года со счетом 2018 для John-A-1, и обновленный счет становится 100 .

Для Simon-B-2 выполнение было 0, поэтому обновление для 2019 для Simon-B-2 не будет.

Примечание: мне не нужно поле Комментарий , это там только для большего разъяснения.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Это немного странно - вы рассчитываете достижение 0 за один год, но не за следующий. Хорошо.

Используйте функции analyti c:

select t.*,
       (case when lag(accomplishment) over (partition by Employee, Project, Task order by year) > 0
             then lag(score) over (partition by Employee, Project, Task order by year)
             else 0
        end) + score as update_score
from t;

от t

0 голосов
/ 14 февраля 2020

Используйте функции analyti c, чтобы определить, был ли результат за предыдущий год, и, если это так, добавьте его в UpdScore.

select Employee, Project, Task, Accomplishment, Score, Year,
  case when lag(Year) over (partition by Employee, Project order by Year) = Year - 1
       then lag(Score) over (partition by Employee, Project order by Year)
       else 0
  end + Score as UpdatedScore
from EmployeeScore;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...