【问题标题】:Sub group aggregation with Case使用案例的子组聚合
【发布时间】:2012-12-05 23:28:20
【问题描述】:

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

表架构如下:

TradeT1

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

任何帮助表示赞赏。

【问题讨论】:

标签: sql sql-server-2008 tsql


【解决方案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

【讨论】:

  • 谢谢肯。相同的结果。这很优雅。
【解决方案2】:

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

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

【讨论】:

  • 您的查询错过了 groupid 8888。我相信我可能在这里找到答案:sqlfiddle.com/#!3/886c7/4/0
  • 我链接的小提琴的标志是倒着的。当你说总和大于100时,你需要更清楚你想要什么。是不是以借方为正,贷方为负的总和?
  • 是的,借记为加号,贷记为减号,绝对清楚(大于 100 或小于 -100 - CashDiff 的绝对值)实际上我的小提琴仍然不正确。 CashDiff 中返回的汇总数字不正确。 sqlfiddle.com/#!3/2bfea/4
  • 劳伦斯,感谢您的帮助。对您的代码稍作修改似乎效果很好。欣赏它。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多