Sql 带Case的子组聚合

Sql 带Case的子组聚合,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我试图返回groupid、MasterAccountName和CashAmountDiff的列表,其中具有相同groupid的交易的现金总额在任何日期都大于100 表架构如下所示: TradeT1 TradeId | SubAccountId | MasterAccId | GroupId | TradeDate | TradeType 主账户 Id | MasterAccName 子账户 Id | SubAccName | MasterAccountId 每个子帐户都链接到一个主帐

我试图返回groupid、MasterAccountName和CashAmountDiff的列表,其中具有相同groupid的交易的现金总额在任何日期都大于100

表架构如下所示:

TradeT1

TradeId | SubAccountId | MasterAccId | GroupId | TradeDate | TradeType 
主账户

Id | MasterAccName 
子账户

Id | SubAccName | MasterAccountId 
每个子帐户都链接到一个主帐户。这是一种多对一的关系

交易类型决定交易的“方向”,无论是借记还是贷记。我在添加每个groupid的借项和贷项时遇到问题。我的问题只是把一切加起来。我不知道当贷记(乘以现金金额*-1)时如何合并,当借记仅使用现金金额时如何合并

将始终有多个tradeid链接到单个groupid

在我的努力下,这里有SQL fiddle中的表:


感谢您的帮助。

这只是您针对+/-的查询。我可能会在后院看到这些标志

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

通过在子查询中转换信用和借记,并在聚合查询中使用这些结果,可以大大简化此查询

比如

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]
这样,您就有了一个不错的现金金额列表,可以在周围的聚合查询中使用

整个查询将如下所示

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

未定义CashAmount或CashAmountDiff列已更新但未编译代码。您的查询缺少groupid 8888。我相信我可能在这里找到了答案:我连接的小提琴上的符号是向后的。当你说总和大于100时,你需要更清楚地知道你想要什么。这是借方为正数,贷方为负数的总和吗?是的,借方为正数,贷方为负数,要绝对清楚(大于100或小于-100——现金差的绝对值),实际上我的小提琴还是不正确的。CashDiff中返回的合计数字不正确。劳伦斯,谢谢你的帮助。对代码稍加修改就可以很好地工作。谢谢你,肯。相同的结果。这是相当优雅的。
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