1

我正在尝试返回 groupid、masteraccountnames 和 CashAmountDiff 的列表,其中具有相同 groupid 的交易的 CashAmount 总和在任何日期都大于 100。

表模式是这样的:

贸易T1

TradeId | SubAccountId | MasterAccId | GroupId | TradeDate | TradeType 

主账户

Id | MasterAccName 

子帐户

Id | SubAccName | MasterAccountId 

每个子帐户都链接到一个主帐户。这是一个多对一的关系。

TradeType 确定交易的“方向”,无论是借方还是贷方。我在添加每个 groupid 的借方和贷方时遇到问题。我的查询只是总结一切。我不知道如何合并 Case When Credit(乘 CashAmount * -1),Case When Debit 只使用 CashAmount

总会有超过 1 个 tradeid 链接到一个 groupid。

我在这里有 SQL fiddle 中的表以及我的努力: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

任何帮助表示赞赏。

4

2 回答 2

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
于 2012-12-06T00:35:58.937 回答
1

这只是适用于 +/- 的查询。我可能有倒退的迹象。

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

于 2012-12-05T23:52:33.850 回答