2011-03-28 45 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