Sql 带Case的子组聚合
我试图返回groupid、MasterAccountName和CashAmountDiff的列表,其中具有相同groupid的交易的现金总额在任何日期都大于100 表架构如下所示: TradeT1Sql 带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 每个子帐户都链接到一个主帐
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