Как проверить, что заданное значение c диапазона заполнено в SQL оконными функциями? - PullRequest
0 голосов
/ 08 января 2020

Я работаю над проектом, в котором мы должны оценивать поставщиков, и в этой базе данных у меня есть эта таблица EvaluationGrade:

+------+---------------------+------------+-----------+
| Id   | EvaluationMethodId  | FromScore  | ToScore   |                       
+------+---------------------+------------+-----------+
| 1    |       2             |     1      |    20     |
| 2    |       2             |     21     |    50     |
| 3    |       2             |     51     |    70     |
| 4    |       2             |     71     |    100    |
| 5    |       3             |     1      |    20     |
| 6    |       3             |     31     |    40     |
+------+---------------------+------------+-----------+

Эта таблица классифицирует баллы, и я уверен, что EvaluationMethodId=2 Значения области действия заполняются от 1 до 100 (так же, как в примере выше).

Я ищу что-то вроде этого:

+---------------------+------------+
| EvaluationMethodId  |    Sum     |                      
+---------------------+------------+
|       2             |     100    |
|       3             |     30     |
+---------------------+------------+

Вот как я пытался:

WITH myUpdate
AS (SELECT emg.Id,emg.EvaluationMethodId,
           SUM(emg.ToGrade - emg.FromGrade) + 1 AS SumScope
    FROM generalsup.EvaluationMethodGrading emg
    GROUP BY emg.Id,emg.EvaluationMethodId)
SELECT myUpdate.EvaluationMethodId, SUM(myUpdate.SumScope) AS SumScopeAll
FROM myUpdate
GROUP BY myUpdate.EvaluationMethodId;

Но я использую оконную функцию, которая снижает нагрузку на сервер.

1 Ответ

2 голосов
/ 08 января 2020

Поскольку в баллах нет совпадений, вы можете сделать это с помощью group by EvaluationMethodId и sum():

select EvaluationMethodId, sum(ToScore - FromScore + 1) [Sum]
from EvaluationMethodGrading 
group by EvaluationMethodId

См. Демоверсию . Результаты:

> EvaluationMethodId | Sum
> -----------------: | --:
>                  2 | 100
>                  3 |  30
...