Sql server 2008 添加由GROUPBY子句生成的列

Sql server 2008 添加由GROUPBY子句生成的列,sql-server-2008,Sql Server 2008,我陷入了一个场景,在使用GROUPBY之后,我需要从两行添加列。 我的问题是: select AcctId,DC,sum(TrnAmt) from TableId group by AcctId,DC order by AcctId,DC 结果:- VcrAcctId DrCr SumTranAmt 51 C 37469 51 D 37000 我的预期结果是: VcrAcctId Actual 51 37469-3

我陷入了一个场景,在使用GROUPBY之后,我需要从两行添加列。 我的问题是:

select AcctId,DC,sum(TrnAmt) from TableId
group by AcctId,DC
order by AcctId,DC
结果:-

VcrAcctId      DrCr  SumTranAmt
51            C    37469
51      D      37000
我的预期结果是:

VcrAcctId      Actual
51     37469-37000

如何在同一查询中获得预期结果?

这是假设实际值在DrCR上排序,因此C结果行位于D结果行之前。 另外,将表1替换为原始查询中的CTE,以便首先对每个VcrAcctId和DC进行汇总

SELECT VcrAcctId, STUFF((SELECT '-' + convert(varchar(100),SumTranAmt)
              FROM Table1 I
              WHERE Table1.VcrAcctId = I.VcrAcctID 
              ORDER BY DrCr
             FOR XML PATH ('')),1,1,'')
FROM Table1
Group by VcrAcctId

基于我认为您需要的评论中的讨论

SELECT AcctId,
       Sum(CASE DC
             WHEN 'C' THEN TrnAmt
             WHEN 'D' THEN -TrnAmt
             ELSE 0
           END) AS DC
FROM   TableId
GROUP  BY AcctId
ORDER  BY AcctId 
如果你真的想把贷项和借项分开,你可以使用

SELECT AcctId,
       Sum(CASE
             WHEN DC = 'C' THEN TrnAmt
             ELSE 0
           END) AS C,
       Sum(CASE
             WHEN DC = 'D' THEN TrnAmt
             ELSE 0
           END) AS D
FROM   TableId
GROUP  BY AcctId
ORDER  BY AcctId 

您可以将
SUM
表达式强制转换为
varchar
,并将它们连接起来,以获得问题中显示的结果,如果这是实际需要的结果。

每个
VcrAcctId
是否总是恰好有两行?如果不是,应该显示什么?不,只能有一个VcrAcctId,在这种情况下,DrCr列将是D或C,带有一个SUMTRANAMTS,所以如果有两行,您实际上总是希望显示
C-D
,如果只有一行呢?如果是
C
D
,结果是否有区别?事实上,您是否试图获取所有贷项和借项的净值,以便理想情况下希望结果
469
作为示例数据的结果?确切地说,我有一个交易表,其中一个帐户可以有多个贷项或借项,或者只有一个贷项或借项。我的查询是由CTE查询产生的,我不知道连续的CTE查询是否有效。但是性能会更差,引用CTE的
XML路径
子查询可能会导致对定义CTE的基础
group by
查询进行多次求值。hi Martin..您能为我的链接提供解决方案吗。。