Как найти все комбинации, равные данной сумме? - PullRequest
0 голосов
/ 08 июня 2019

В SQL у меня есть список типов транзакций и значение. Простой пример ниже.

|-----------|--------|
| Tran.Type | Value  | 
|-----------|--------|
|     04    |   10   |
|-----------|--------|
|     07    |   10   |
|-----------|--------|
|     04    |   5    |
|-----------|--------|
|     01    |   8    | 
|-----------|--------|



|-----------------|
| Current Balance |
|-----------------|
|        13       |
|-----------------|

Цель состоит в суммировании значений и получении числа 13. В этом примере легко обнаружить, что тип 07 является отрицательным. Так 10-10 + 5 + 8 = 13

Но когда количество транзакций достигает 20 и 10 разных типов, это довольно сложно. Также значения являются положительными и отрицательными.

Пока я придумал это.

import itertools
numbers = list(map(int, input("Enter multiple values: ").split()))
expectedSum = int(input("Enter expected value: "))
result = [seq for i in range(len(numbers), 0, -1) for seq in 
itertools.combinations(numbers, i) if sum(seq) == expectedSum]
print (result)<code>    

Есть идеи, как включить тип в секцию результатов? а если этот тип противоположного значения или нет?

1 Ответ

0 голосов
/ 10 июня 2019

Есть несколько способов сделать это, используя CASE в своем выражении SQL ИЛИ, если у вас ОЧЕНЬ большой список, введите поле, которое будет содержать +1 или -1 в зависимости от типа транзакции, а затем, когдаВы выполняете значения, умножающие значение, и, наконец, делаете сумму.Пример, здесь;

ALTER TABLE Tran ADD COLUMN tran_multiple INT default 1;

-- update each value as req.
UPDATE Tran set tran_multiple=-1 WHERE Tran.id = xxxx; 

SELECT sum (TranValue.Value * Tran.tran_multiple) as Val From TranValue 
    INNER JOIN Tran on TranValue.Type = Tran.Type 

Здесь я предполагаю, что ваша таблица TranValue хранит значения.Конечно, вы можете использовать выражение Group By GROUP BY Tran.type в своем выражении вместе с Tran.type в вашем списке полей SELECT (для перечисления по Tran.Type & Values).Тогда написание простого кода не должно быть проблемой.

Однако я бы попросил вас не использовать VALUE или VALUES в вашем SQL, поскольку он очень похож на RESERVED KEYWORDs ( просто предложение )

Я не привожу здесь пример CASE, поскольку вы не указали, какую базу данных вы используете (синтаксис варьируется), а также поскольку вы утверждаете, что существует большое количество типов.

Если выпредпочтение кодированию вместо SQL, то же самое можно сделать, определив словарь, в котором каждый тип содержит +1 или -1 в зависимости от тип , а затем, когда пользователь вводит значения, которые выможно умножить , набрать и сделать это.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...