2012-12-05 135 views
1

我試圖返回groupid's,masteraccountnames和CashAmountDiff的列表,其中具有相同groupid的交易的CashAmount的總和在任何日期都大於100。小組聚合與案例

表架構是像這樣:

TradeT1

TradeId | SubAccountId | MasterAccId | GroupId | TradeDate | TradeType 

MasterAccount

Id | MasterAccName 

子帳戶

Id | SubAccName | MasterAccountId 

每個SubAccount都鏈接到MasterAccount。這是一種多對一的關係。

TradeType決定交易的'方向',無論是借方還是貸方。我無法爲每個groupid添加借方和貸項。我的查詢只是總結一切。我不知道如何合併案件時,信用(乘以CashAmount * -1),案件當借記只使用CashAmount

總是會有超過1個tradeid鏈接到一個groupid。

我在SQL小提琴這裏的表和我一起努力:http://www.sqlfiddle.com/#!3/45580/1/0

SELECT 
t.groupId, 
ma.MasterAccName, 
sum(CASE WHEN t.tradetype = 'Credit' 
     THEN sum(-1*t.cashamount) 
    ELSE sum(t.cashamount)) 
END as CashDiff 
FROM tradet1 t 
JOIN masteraccount ma 
ON t.masteraccid = ma.id 
WHERE t.groupid > -1 
GROUP BY t.groupid, ma.MasterAccName 
HAVING count(t.groupid) > 1 and sum(t.cashamount) > 100 

讚賞任何幫助。

+0

無CashAmount或CashAmountDiff列定義 – Paparazzi

+0

代碼更新,但不進行編譯。 http://www.sqlfiddle.com/#!3/45580/9 – user1773949

回答

1

您可以將您的貸方和借方在一個子查詢和使用您的彙總查詢這些結果簡化這個查詢了不少。

SELECT [tt].[GroupId] , 
      [ma].[MasterAccName] , 
      CASE WHEN [tt].[TradeType] = 'Credit' 
       THEN [tt].[CashAmount] * -1 
       ELSE [tt].[CashAmount] 
       END AS CashAmount 
FROM  [dbo].[TradeT1] AS tt 
      JOIN [dbo].[MasterAccount] AS ma ON [tt].[MasterAccId] = [ma].[Id] 

有了這個,你有CashAmounts的正面和負面的周圍聚集查詢使用的一個很好的列表。

整個查詢看起來像這樣

SELECT [tn].[GroupId] , 
     [tn].[MasterAccName] , 
     SUM([tn].[CashAmount]) AS CashDiff 
FROM (SELECT [tt].[GroupId] , 
        [ma].[MasterAccName] , 
        CASE WHEN [tt].[TradeType] = 'Credit' 
         THEN [tt].[CashAmount] * -1 
         ELSE [tt].[CashAmount] 
        END AS CashAmount 
      FROM  [dbo].[TradeT1] AS tt 
        JOIN [dbo].[MasterAccount] AS ma ON [tt].[MasterAccId] = [ma].[Id] 
     ) AS tn 
GROUP BY [tn].[GroupId] , 
     [tn].[MasterAccName] 
HAVING ABS(SUM([tn].[CashAmount])) > 100 AND COUNT([tn].[GroupId]) > 1 
+0

THanks Ken。相同的結果。這很優雅。 – user1773949

1

這只是您的查詢適應+/-。我可能有跡象backkwards。

Select 
    t.groupId, 
    ma.MasterAccName, 
    Sum (Case When TradeType = 'Credit' Then -t.cashamount Else t.cashamount End) AS 'CashDiff' 
From 
    tradet1 t 
     Inner Join 
    masteraccount ma 
     On t.masteraccid = ma.id 
Where 
    t.groupid > -1 
Group By 
    t.groupid, 
    ma.MasterAccName 
Having 
    Count(t.groupid) > 1 And 
    Sum (Case When TradeType = 'Credit' Then -t.cashamount Else t.cashamount End) > 100 

http://www.sqlfiddle.com/#!3/45580/20

+0

您的查詢未命中groupid 8888.我相信我可能在這裏有答案:http://www.sqlfiddle.com/#!3/886c7/4/0 – user1773949

+0

我連接的小提琴有跡象倒退。當你說總和大於100時,你需要更清楚你想要的內容。這是與扣除和加分爲負數相加的總和嗎? – Laurence

+0

是的,作爲加號和信用作爲缺點並且絕對清楚的借方(大於100或小於-100 - CashDiff的絕對值)實際上,我的小提琴仍然不正確。 CashDiff中返回的總數字不正確。 http://www.sqlfiddle.com/#!3/2bfea/4 – user1773949