选择正负值的总和:postgres

ese*_*sem 3 sql postgresql postgresql-9.1

我有一个简单的任务来计算用户帐户余额的总和或平均值。

用户在该月内可能有负余额或正余额。这是当月的用户余额示例

95.63
97.13
72.14
45.04
20.04
10.63
-29.37
-51.35
-107.55
-101.35
-157.55
-159.55
-161.55
Run Code Online (Sandbox Code Playgroud)

我想要

  1. 选择负值,计算它们的总和/平均值

  2. 选择正值,计算它们的总和/平均值

  3. 用 2 列表示它们

想要的结果

340.61      -768.27
Run Code Online (Sandbox Code Playgroud)

当我使用UNION运算符时,我得到两行。使用CASE.. WHEN..它时对余额进行分组,我收到多行。

我的 postgres 查询中有其他聚合函数,因此我希望它们中的每一个都显示在单独的列中。有没有办法做到这一点?

kli*_*lin 6

在 Postgres 9.1 中:

select
    sum(case when val >= 0 then val end) as positive,
    sum(case when val < 0 then val end) as negative
from the_data;
Run Code Online (Sandbox Code Playgroud)

Postgres 9.4+ 的替代解决方案:

select 
    sum(val) filter (where val >= 0) as positive,
    sum(val) filter (where val < 0) as negative
from the_data;
Run Code Online (Sandbox Code Playgroud)


Vao*_*sun 5

v=# select sum(case when f < 0 then f end) n, sum(case when f >= 0 then f end) p from s170;
    n    |   p
---------+--------
 -768.27 | 340.61
(1 row)
Run Code Online (Sandbox Code Playgroud)

这?..为什么不使用 case 两次?