添加GROUP BY子句生成的列

时间:2012-12-15 12:22:03

标签: sql-server-2008

我遇到了一个场景,我需要在使用GROUP BY后从两行添加列。 我的查询如下:

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

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

2 个答案:

答案 0 :(得分:1)

这假设在DrCR上订购了Actual,因此C结果行在D结果行之前。 另外,将Table1替换为原始查询中的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

SQL Fiddle Demo

答案 1 :(得分:1)

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

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并连接它们以获得问题中显示的结果,如果这是实际需要的。