2011-03-28 46 views
0

我有2个表。一个原始数量保持不变。第二张表中列出了一段时间内针对第一张表中的原始金额应用的部分金额。SQL - 在where条款中选择不同总和级别

DB表:

***memotable*** 
ID [primary, unique] 
Amount (Orginal Amount) 

***transtable*** 
ID [many IDs in transtable to single ID in memotable] 
AmountUsed (amount applied) 
ApplyDate (date applied) 

我想找到,在一个单一的选择,该ID,自上周(ApplyDate> 2011-04-21),迄今使用量使用量。

应该出现在结果中的唯一行是上周以来使用金额的时间(ApplyDate> 2011-04-21)。

我被困在试图获得用于迄今为止的金额的总和,因为那需要包括ApplyDate> 2011-04-21之外的AmountUsed值。

+0

SELECT A.ID, A.Amount, SUM(B.AmountUsed)AS AmountUsedWeek, (SELECT SUM(B.AmountUsed)AS AmountUSedTotal FROM transtable C WHERE A.ID = C.ID) FROM memotable A,transtable B WHERE B.ApplyDate>'2011-02-07'AND A.ID = B.D GROUP BY A.ID,A.Amount – brennt 2011-03-28 17:54:07

回答

2

有可能避免在这种情况下子选择:

SELECT 
    ID, 
    AmountUsedSinceLastWeek = SUM(CASE WHEN ApplyDate > '4/21/2011' THEN AmountUsed END) 
    AmountUsedToDate = SUM(AmountUsed) 
FROM TransTable 
GROUP BY ID 
+0

我认为这会给我额外的行(那些<= 4/21/2011),但它不!看起来这是更好的方法。出于curisoity,我不知道如何显示所有行。 – brennt 2011-03-29 14:45:34

+0

@brennt:对不起,我没有关注。 'AmountUsedToDate = SUM(AmountUsed)' - 我以为是总结所有行。或者你是什么意思? – 2011-03-29 14:51:04

+0

您的解决方案是正确的。它只能正确显示上周申请金额的行,同时也显示总计。我只是想知道为什么它会这样做,而不是一直显示所有行。 – brennt 2011-03-29 15:06:07

1

既然要限制它自上周以来所发生的行,但还希望包括总到今天为止,我认为最有效的方法是使用子查询...

SELECT 
    lastWeek.ID, 
    lastWeek.AmountUsedSinceLastWeek, 
    toDate.AmountUsedToDate 
FROM 
(
    SELECT 
     ID, 
     SUM(AmountUsed) AS AmountUsedSinceLastWeek 
    FROM TransTable 
    WHERE ApplyDate > '4/21/2011' 
    GROUP BY ID 
) lastWeek JOIN 
(
    SELECT 
     ID, 
     SUM(AmountUsed) AS AmountUsedToDate 
    FROM TransTable 
    GROUP BY ID 
) toDate ON lastWeek.ID = toDate.ID 
+0

这很好用!非常感谢! – brennt 2011-03-28 18:27:24