2012-12-15 27 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