Доля в процентах для N числа пользователей - PullRequest
0 голосов
/ 02 марта 2019

У меня есть таблица, подобная следующей

Id UserName PercentSharing ParentId
1  one      20             0
2  two      80             1
3  three    40             2
4  four     50             2
5  five     20             3
6  six      30             3

Я хочу рассчитать, что все уровни не должны превышать 100%

Если я изменю PercentSharing на Id 2 на 70, его родитель должен быть обновлендо 30, и если какой-либо процент, разделяющий пользователей, идентифицирует 3 или 4 с любыми другими значениями, то он должен поддерживать процент совместного использования до 100% для всех родительских пользователей.Например, общее количество идентификаторов пользователей 3,2,1 не должно превышать 100%

Я хочу сохранить соотношение 100% для числа или уровня N.

Пожалуйста, предложите мне изменить структуру таблицы?

1 Ответ

0 голосов
/ 02 марта 2019

Рассмотрим следующее;вложенная модель ...

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id CHAR(1) NOT NULL PRIMARY KEY
,pct INT NOT NULL
,lft INT NOT NULL
,rgt INT NOT NULL
);

INSERT INTO my_table VALUES
('A',20,1,12),
('B',80,2,11),
('C',40,3, 8),
('D',50,9,10),
('E',20,4, 5),
('F',30,6, 7); 

SELECT * FROM my_table x JOIN my_table y ON y.lft <= x.lft WHERE x.id = 'E';
+----+-----+-----+-----+----+-----+-----+-----+
| id | pct | lft | rgt | id | pct | lft | rgt |
+----+-----+-----+-----+----+-----+-----+-----+
| E  |  20 |   4 |   5 | A  |  20 |   1 |  12 |
| E  |  20 |   4 |   5 | B  |  80 |   2 |  11 |
| E  |  20 |   4 |   5 | C  |  40 |   3 |   8 |
| E  |  20 |   4 |   5 | E  |  20 |   4 |   5 |
+----+-----+-----+-----+----+-----+-----+-----+

SELECT x.*, SUM(y.pct) total FROM my_table x JOIN my_table y ON y.lft <= x.lft WHERE x.id = 'E' GROUP BY x.id;
+----+-----+-----+-----+-------+
| id | pct | lft | rgt | total |
+----+-----+-----+-----+-------+
| E  |  20 |   4 |   5 |   160 |
+----+-----+-----+-----+-------+
1 row in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...