Расчет значений на основе значений в других строках - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь разделить значение одного столбца на основе того, есть ли несколько строк, которые соответствуют критериям. Для этого примера у всех книг есть «Первичный» автор, который всегда получит полную сумму баллов. Книги могут также иметь одного или нескольких «вторичных» авторов, если у книги более одного вторичного автора, баллы делятся поровну между вторичными авторами.

Требуется вывод последнего столбца «NewPoints». Пример:

Книга 1 имеет значение баллов 1 и только один дополнительный автор, поэтому вторичный автор получает полное значение 1 балла.

Книга 2 имеет значение баллов 1 и имеет двух дополнительных авторов поэтому второстепенные авторы получают по 0,5 балла каждый.

Книга 3 имеет балл по 0,5 и имеет трех вторичных авторов, поэтому вторичные авторы получают по 0,16 балла каждый.

Select
b.BookID,
b.BookName,
bd.points,
a.AuthorName,
a.AuthorType,


From Book as b

LEFT JOIN bookdetails as bd
ON b.BookID = bd.BookID_FK

LEFT JOIN authors as a
ON bd.AuthorBookID = a.AuthorBookID
BookID | BookName      |Points|AuthorName   |Author Type | NewPoints

1      | Ocean's 11    |  1   | James Smith | Primary    |   1

1      | Ocean's 11    |  1   | Linus Key   | Secondary  |   1

2      | Number Two    |  1   | Jason Pitt  | Primary    |   1

2      | Number Two    |  1   | Will Franks | Secondary  |   0.5

2      | Number Two    |  1   | Donald Pe   | Secondary  |   0.5

3      | Cactus Jack   | 0.5  | Brad Saul   | Primary    |   0.5

3      | Cactus Jack   | 0.5  | Will Franks | Secondary  |   0.16

3      | Cactus Jack   | 0.5  | Linus Key   | Secondary  |   0.16

3      | Cactus Jack   | 0.5  | George Bray | Secondary  |   0.16

1 Ответ

0 голосов
/ 30 апреля 2020

Если у вас есть только два типа:

select b.BookID, b.BookName, bd.points, a.AuthorName, a.AuthorType,
       (case when bd.AuthorType = 'Primary' then bd.points
             else bd.points / count(*) over (partition by b.BookId, bd.AuthorType)
        end) as new_points
from Book b left join
     bookdetails as bd
     on b.BookID = bd.BookID_FK left join
     authors a
     on bd.AuthorBookID = a.AuthorBookID;

Если у вас более двух типов и вы хотите сосредоточиться на Secondary, то:

       (case when bd.AuthorType = 'Primary'
             then bd.points
             when bd.AuthorType = 'Secondary'
             then bd.points / count(*) over (partition by b.BookId, bd.AuthorType)
        end) as new_points
...