在 sql 中求和

Sum a sum in sql

早上好,我是 sql 的新手,如果这是一个愚蠢的问题,我深表歉意

我正在尝试计算 totalcredit - totaldebit 的总和,但出现错误。如果我删除总和(总和行我得到总计和总计的计算结果)但我需要更进一步。

如果有人能告诉我哪里出错了,我将不胜感激

       Sum(CASE WHEN dbt_crt = 'D' THEN sec_amount ELSE 0 END) as TotalDebit,
       Sum(CASE WHEN  dbt_crt = 'C' THEN sec_amount ELSE 0 END) as TotalCredit,
       sum(sum(TotalDebit) - sum(TotalCredit)))
    FROM test_securities_trans
    group by client_acc, sec_isin
    
    Started executing query at Line 207
    Msg 102, Level 15, State 1, Line 4
    Incorrect syntax near ')'.
    Total execution time: 00:00:00.011 ```

您想计算​​同一行的差异,因此不需要嵌套聚合函数。您可以简单地添加另一个条件和,如下所示:

sum(case when dbt_crt = 'c' then sec_amount else -sec_amount end) as totaldiff

这假设 'C''D' 是唯一可能的值(否则您将需要另一个 WHEN 分支而不是 ELSE)。您可以使用 WHERE 子句更明确地说明这一点:

select client_acc, sec_isin,
   sum(case when dbt_crt = 'D' then sec_amount else 0 end) as totaldebit,
   sum(case when dbt_crt = 'C' then sec_amount else 0 end) as totalcredit,
   sum(case when dbt_crt = 'C' then sec_amount else -sec_amount end) as totaldiff
from test_securities_trans
where dbt_crt in ('C', 'D')
group by client_acc, sec_isin

您需要重复表达:

   Sum(CASE WHEN dbt_crt = 'D' THEN sec_amount ELSE 0 END) as TotalDebit,
   Sum(CASE WHEN dbt_crt = 'C' THEN sec_amount ELSE 0 END) as TotalCredit,
   Sum(CASE WHEN dbt_crt = 'D' THEN sec_amount  
            WHEN dbt_crt = 'C' THEN - sec_amount
            ELSE 0
       END) as NetAMount,

您不能在 SELECT 中重复使用列别名。另外,SQL不支持嵌套的SUM()

你的问题是你两次使用聚合函数 sum(sum.....sum..) 和来自同一个 select 的别名(不允许在同一个 select 中使用别名)。

只需使用:

 Sum(CASE WHEN dbt_crt = 'D' THEN sec_amount ELSE 0 END) -
 Sum(CASE WHEN  dbt_crt = 'C' THEN sec_amount ELSE 0 END) 

或其他答案中描述的更简单的方法:

 Sum(CASE WHEN dbt_crt = 'D' THEN sec_amount ELSE -1*sec_amount END)