Gui*_*rti 12 sql postgresql sum case aggregate-functions
我有这样的代码:
select
tbl.person
,COUNT(distinct tbl.project)
,if (tbl.stage like '%SIGNED%') then sum(tbl.value) else '0' end if as test
from
my_table tbl
group by
1
Run Code Online (Sandbox Code Playgroud)
它返回给我该错误消息:
SQL Error [42601]: ERROR: syntax error at or near "then"
Run Code Online (Sandbox Code Playgroud)
我没明白。正如我在文档中看到的,if 语句语法似乎使用正确
GMB*_*GMB 15
IF
将在过程中使用,而不是在查询中使用。使用case
表达式代替:
select
tbl.person
,COUNT(distinct tbl.project)
,sum(case when tbl.stage like '%SIGNED%' then tbl.value else 0 end) as test
from
my_table tbl
group by
1
Run Code Online (Sandbox Code Playgroud)
笔记:
tbl.stage
不是 的一部分group by
,因此它很可能应该包含在聚合表达式内,而不是在聚合表达式之外
表达式返回的所有值都case
需要具有相同的数据类型。由于sum(tbl.value)
是数字,else
分支应该返回0
(数字),而不是'0'
(字符串)。
在 Postgres 中,我建议使用filter
:
select tbl.person, COUNT(distinct tbl.project)
sum(tbl.value) filter (where tbl.stage like '%SIGNED%') as test
from my_table tbl
group by 1;
Run Code Online (Sandbox Code Playgroud)
if
是控制流逻辑。在处理查询时,您希望了解如何更多地以集合的方式进行思考。所以想法是过滤行并将过滤后的值相加。