2012-12-15 31 views
3

我陷入了一个场景,在使用GROUP BY之后需要从两行添加列。 我的查询都要为:添加从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 

怎样才能让我的预期的结果在同一个查询?

+0

每个'VcrAcctId'总是只有两行吗?如果不是应该显示什么? –

+0

不,只能有一个VcrAcctId,在这种情况下,DrCr列将是D或C,并带有一个SumTranAmt – vstsdev

+0

因此,如果有两行,实际上总是希望显示“C-D”,如果只有一行?如果它是'C'或'D',它的结果是不同的?您是否实际上试图获得所有信用和借记的净值,以便理想情况下您希望将结果'469'作为示例数据的结果? –

回答

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并将conc让他们获得问题中显示的结果,如果这是实际需要的。

+0

这真棒..谢谢马丁.. – vstsdev

+0

嗨马丁..你给我的链接解决方案http://stackoverflow.com/questions/13899909/calculating-from-rows-and-columns .. – vstsdev

1

这是假设Actual是在DrCR上排序的,所以C结果行出现在D结果行之前。 另外,用原始查询中的CTE替换Table1,以便首先按照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

+0

** + 1 **不错的一个.. –

+0

我的查询是由CTE查询产生的,我不知道连续的CTE querry是否有效。 – vstsdev

+0

它应该很好地工作 – cairnz