2011-05-22 45 views
1

我想从量获得总那里慈善是0减去量的总和,其中慈善是1总不工作

SELECT SUM(Amount) - (SELECT SUM(Amount) 
         FROM Transactions 
         WHERE (Charity = 1)) 
    FROM Transactions 
WHERE (Charity = 0) 

该查询运行,但不会给我正确的结果。

+0

样的数据?预期成绩?当我们不知道什么是错时,知道如何纠正它有点棘手。 – 2011-05-22 03:57:56

+0

我想我得到了问题..一些价值观是负面的一些是积极的,这就是为什么结果不如预期。我怎样才能让所有的数字被视为正面的? – Ezi 2011-05-22 04:15:35

+0

我们可以通过在'Amount'列中插入一个'ABS()'调用)来处理所有值为正的值,但是它会引发严重的问题,从而导致计算结果是否具有(财务)意义。 – 2011-05-22 04:18:14

回答

2

治疗为阳性的所有值:

SELECT SUM(ABS(Amount)) - (SELECT SUM(ABS(Amount)) 
         FROM Transactions 
         WHERE (Charity = 1)) 
    FROM Transactions 
WHERE (Charity = 0) 

但它严重怀疑,否定交易应及时治疗与正面相同。如果有,合法,在该表中负的交易,那么他们也许应该被视为底片(在原始查询),或排除:

SELECT SUM(Amount) - (SELECT SUM(Amount) 
         FROM Transactions 
         WHERE (Charity = 1) AND Amount > 0) 
    FROM Transactions 
WHERE (Charity = 0) AND Amount > 0 

不知道什么设施SQLite中可用。在标准SQL中,我可能会改写这个为:

SELECT 
    COALESCE(SUM(CASE WHEN Charity=0 THEN Amount END),0) - 
    COALESCE(SUM(CASE WHEN Charity=1 THEN Amount END),0) 
FROM Transactions 
WHERE 
    Charity in (0,1) AND 
    Amount > 0 

(或类似变换为ABS版)

+0

在最后一个查询中有一个“SUM(CASE ...)”表达式会返回NULL(因此整个结果将为NULL),以防有只有'Charity = 0'的行或只有'Charity = 1'(当然不一定是OP的情况)。 – 2011-05-22 08:56:40

+0

@Andriy - 好的电话 – 2011-05-22 08:58:18

1

试试看是否有帮助。

select a.sum1 - b.sum2 
from 
(SELECT SUM(Amount) as sum1 FROM Transactions WHERE (Charity = 0)) A, 
(SELECT SUM(Amount) as sum2 FROM Transactions WHERE (Charity = 1)) B 
1

尝试下面的(我希望这是SQLite中有效):

SELECT (SELECT SUM(Amount) FROM Transactions WHERE (Charity = 0)) - 
     (SELECT SUM(Amount) FROM Transactions WHERE (Charity = 1)) 
+0

它的工作原理,但结果不是我要找的... – Ezi 2011-05-22 04:01:17

+0

所以这个_doesn't_给你(总慈善0) - (总慈善1)? – 2011-05-22 04:03:11

+0

plz看到上面的评论,我想我找到了问题。 – Ezi 2011-05-22 04:16:45