2017-02-27 28 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 
相关问题