2017-02-27 46 views
0

我有這個CTE。我的目標是顯示結果集中的所有行和具有相同值的列的總數。如何將Totals添加到CTE生成的行組中

WITH CTEVal AS 
(SELECT RNum, Amount, Tag, TAmount, 
ROW_NUMBER() OVER(ORDER BY CONVERT(DATETIME, TDate, 101) DESC) AS RowNum 
from [dbo].[viewJD]) 

SELECT TDate, RNum, 
    CASE WHEN Tag = 'DR' THEN CONVERT(VARCHAR(50),Amount) ELSE '0.00' END AS Debit, 
    CASE WHEN Tag = 'CR' THEN CONVERT(VARCHAR(50),Amount) ELSE '0.00' END AS Credit FROM CTEVal 

返回結果集

TDate  Rnum Debit Credit 
12-22-2015 8  100  0.00 
12-22-2015 8  300  0.00 
12-22-2015 8  0.00  400 
12-22-2015 9  250  0.00  
12-22-2015 9  250  0.00  
12-22-2015 9  0.00  500 
12-23-2015 10  600  0.00  
12-23-2015 10  0.00  100  
12-23-2015 10  0.00  500 

預期的結果集

TDate  Rnum Debit Credit 
12-22-2015 8  100  0.00 
12-22-2015 8  300  0.00 
12-22-2015 8  0.00  400 
      TOTAL 400  400 
12-22-2015 9  250  0.00  
12-22-2015 9  250  0.00  
12-22-2015 9  0.00  500 
      TOTAL 500  500 
12-23-2015 10  600  0.00  
12-23-2015 10  0.00  100  
12-23-2015 10  0.00  500 
      TOTAL 600  600 

選擇*從viewJD將返回

TDate  Rnum Amount Tag TAmount 
12-22-2015 8  100  DR 400 
12-22-2015 8  300  DR 400 
12-22-2015 8  400  CR 400 
12-22-2015 9  250  DR 500  
12-22-2015 9  250  DR 500  
12-22-2015 9  500  CR 500  
12-23-2015 10  600  DR 600  
12-23-2015 10  100  CR 600  
12-23-2015 10  500  CR 600  
DR的

總和= CR的總和= TAmount

+4

看看使用'ROLLUP'也許:https://technet.microsoft.com/en-us/library/bb522495(v=sql.105).aspx。你沒有腳本化你的源數據的樣本,否則我會回答一個完整的解決方案。 – Tanner

+0

@Jc Balantakbo你可以告訴我什麼是表viewJD中列Rnum的數據類型..? – DJs

+0

@Siya Rnum應該是int –

回答

0

您在預期輸出中提供的格式不可行或不可取。以下代碼將它們存儲爲單獨的列。

SELECT TDate, 
     RNum, 
     CASE WHEN Tag = 'DR' THEN Amount ELSE 0.00 END AS Debit, 
     CASE WHEN Tag = 'CR' THEN Amount ELSE 0.00 END AS Credit, 
     (select sum(Amount) 
      from [dbo].[viewJD] td2 
      where td2.RNum = td1.RNum 
       and Tag = 'DR') as Debit_Total, 
     (select sum(Amount) 
      from [dbo].[viewJD] td2 
      where td2.RNum = td1.RNum 
       and Tag = 'CR') as Credit_Total 
    FROM [dbo].[viewJD] td1 

這會給你的輸出像

TDate  Rnum Debit Credit Debit_Total Credit_Total 
12-22-2015 8  100  0.00  400.00  400.00 
12-22-2015 8  300  0.00  400.00  400.00 
12-22-2015 8  0.00  400  400.00  400.00 
12-22-2015 9  250  0.00  500.00  500.00  
12-22-2015 9  250  0.00  500.00  500.00  
12-22-2015 9  0.00  500  500.00  500.00 
12-23-2015 10  600  0.00  600.00  600.00  
12-23-2015 10  0.00  100  600.00  600.00  
12-23-2015 10  0.00  500  600.00  600.00 

不是最好看,但最簡單其他查詢使用。

+0

你能提供一個更合適的格式嗎?我真的不需要使用CTE解決方案。只要我到達預期的結果 –

+0

@JcBalantakbo我已經更新了我的答案。我有CTE表,因爲這是你的問題,但解決方案沒有它。我不明白爲什麼要計算按日期排序的行,因爲分組字段已在RNum中給出。 – KindaTechy

0

我有一個解決方案。我知道這不是一個好的解決方案。我曾嘗試使用Rollup,但無法獲得確切的結果格式。所以我想出了這個。 這確實是一個長期的解決方案。 但是我希望你能從中得到一些解決問題的想法。

在這裏,我首先將借記和貸項分離值轉換爲表格變量。 然後我將SUM應用於這些值,並將完整結果提供給cte。 我申請DENSE_RANK得到正確的排序,使'總'行在詳細信息行之後。 最後從顯示'total'的行的列RNum的值'Total'中選擇記錄。

CREATE TABLE viewJD 
( 
TDate Date, 
Rnum INT, 
Amount INT, 
Tag VARCHAR(2), 
TAmount INT 
) 

INSERT INTO viewJD 
VALUES 
('12-22-2015', 8 , 100 ,  'DR', 400), 
('12-22-2015' , 8 , 300 ,  'DR' , 400), 
('12-22-2015', 8 , 400 ,  'CR' , 400), 
('12-22-2015' , 9 , 250 ,  'DR' , 500),  
('12-22-2015' , 9 , 250 ,  'DR' , 500),  
('12-22-2015' , 9 , 500 ,  'CR' , 500),  
('12-23-2015' , 10 , 600 ,  'DR' , 600),  
('12-23-2015' , 10 , 100 ,  'CR' , 600),  
('12-23-2015' , 10 , 500 ,  'CR' , 600 ) 

DECLARE @ValTable TABLE 
(
TDate Date, 
Rnum INT, 
Debit INT, 
Credit INT 
) 

INSERT INTO @ValTable 
SELECT TDate, RNum, 
    CASE WHEN Tag = 'DR' THEN Amount ELSE 0.00 END AS Debit, 
    CASE WHEN Tag = 'CR' THEN Amount ELSE 0.00 END AS Credit 
FROM viewJD 

;WITH cte 
AS (
    SELECT *,RowOrder=DENSE_RANK() OVER (PARTITION BY NULL ORDER By RNUM)  from @ValTable 
    UNION ALL 
    SELECT NULL, 
     RNum , 
     SUM([Debit]) AS Debit, 
     SUM([Credit]) AS Credit , 
     RowOrder =DENSE_RANK() OVER (PARTITION BY NULL ORDER By RNUM)     
    FROM @ValTable 
    GROUP BY TDate,RNum 

) 

SELECT TDate, 
    Rnum = CASE WHEN TDate IS NULL THEN 'Total' ELSE  CONVERT(VARCHAR(20),Rnum) END, 
    Debit, 
    Credit 
FROM cte 
ORDER BY roworder,Rnum,TDate DESC 

DROP TABLE viewJD 
相關問題