2017-08-02 65 views
0

这里做一个子查询内的聚合函数的输入表:帐户需要通过转换行到列

accountnumber year quarter catgeory owedamt payedamt writeoffamt 
101   2001  1  Tax   130.0  0.0   30.0 
101   2001  1  Interest 130.0  30.0  30.0 
101   2001  2  Interest 120.0  20.0  20.0 
102   2002  1  Interest 120.0  100.0  20.0 
102   2002  2  Tax   110.0  100.0  10.0 

输出

accountnumber year quarter Tax (outstanding)  Interest (outstanding) 
101   2001  1   100.0      70.0 
101   2001  2   0.0      80.0 
102   2002  2   10.0      0.0 

这里的“优秀”是caluclated总和的基础上(OWED_AMT - (PAID_AMT + WRITEOFF_AMT))作为未知数

注意:我们需要将列作为税和利息,但这些列中的金额应该是未完成的,这是在t他是以上公式的基础。

注2:用于accountntumber:102,兴趣(优秀)被计算
总和(OWED_AMT - (PAID_AMT + WRITEOFF_AMT)),其是(120-(100 + 20))= 0.0

但是,我们不要在该年度的任何税种和四分之一所以输出结果0.0

如果我们在同一年同一季度有两种税(优秀)和利息(优秀)为零,我们可以跳过该行

我正在使用的查询是:

with summaryData (accountnumber , 
      year , 
      quarter, tax, interest) as 
(
    SELECT accountnumber , 
      year , 
      quarter , 
      SUM(CASE WHEN catgeory = 'Tax' THEN sum(OWED_AMT - (PAID_AMT + WRITEOFF_AMT)) 
        ELSE 0 
       END), 
      SUM(CASE WHEN catgeory = 'Interest' THEN sum(OWED_AMT - (PAID_AMT + WRITEOFF_AMT)) 
        ELSE 0 
       END) 
    FROM acccount 
    GROUP BY accountnumber , 
      year , 
      quarter 
) 
select * from summaryData 
where tax > 0 or interest > 0; 

我在这里得到的错误是:

Cannot perform an aggregate function on an expression containing an aggregate or a subquery. 

回答

2

你并不需要在CTE的嵌套聚合。所以:

with summaryData (accountnumber, year, quarter, tax, interest) as (
     SELECT accountnumber, year, quarter, 
      SUM(CASE WHEN catgeory = 'Tax' THEN OWED_AMT - (PAID_AMT + WRITEOFF_AMT) 
         ELSE 0 
       END), 
      SUM(CASE WHEN catgeory = 'Interest' THEN OWED_AMT - (PAID_AMT + WRITEOFF_AMT) 
         ELSE 0 
       END) 
     FROM acccount 
     GROUP BY accountnumber, year, quarter 
    )