在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>
任何想法如何将类型合并到结果部分?以及该类型是否为相反值?
答案 0 :(得分:0)
有两种方法可以执行此操作,方法是在SQL语句中使用CASE
,或者如果您有一个非常大的列表,则根据交易类型引入一个包含+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
,在SELECT字段列表中也可以使用Tran.type
(用于按Tran.Type和Values列出)。然后编写简单的代码应该不会有问题。
尽管如此,我还是请您不要在SQL中使用VALUE
或VALUES
,因为它与RESERVED KEYWORDs
非常相似(只是一个建议 )
由于您没有指定要使用的数据库(语法不同),而且因为您声称类型很多,所以我不在这里放置CASE
示例。
如果您更喜欢编码而不是SQL,则可以通过定义一个字典来实现同样的目的,其中每个 type 取决于 type 分别容纳+1或-1。当用户输入值时,您可以乘以 type 并将其完成。
希望这会有所帮助。