在 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)
早上好,我是 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)