PostgreSQL:清楚地得到类似id的值的总和

时间:2016-01-21 16:30:24

标签: sql postgresql group-by distinct

我的数据库中有以下关系,

     id    |   month    | balance |
-----------+------------+---------+
 0009gmail | 2016-01-01 |    2000 |
 0009gmail | 2016-02-01 |    3500 |
 0009gmail | 2016-03-01 |     800 |
 0009gmail | 2016-04-01 |    1400 |
 0009gmail | 2016-05-01 |    -500 | 

问题是,我希望日期小于指定日期的不同身份的余额,

我正在使用此查询:

select distinct(id),sum(balance) from payment group by id,month having month<'2016-06-22';

但是它给出了这个结果,

       id    |   sum 
-------------+---------
   0009gmail |    2000
   0009gmail |     800
   0009gmail |    1400
   0009gmail |    3500
   0009gmail |    -500

我想我得到这个结果是因为在group by子句中放了一个月,但是删除它会给出一个错误,那个月必须在聚合函数的任一组中,我想要这个输出,

     id    |   sum 
 ----------+---------
 0009gmail |    7200

请帮助..

2 个答案:

答案 0 :(得分:0)

使用id的简单聚合:

SELECT id, SUM(balance) AS balance
FROM payment 
WHERE month<'2016-06-22'
GROUP BY id;

LiveDemo

enter image description here

图片来自:http://social.technet.microsoft.com/wiki/contents/articles/20724.all-at-once-operations-in-t-sql.aspx

  1. payement表格
  2. 获取行
  3. 仅过滤满足month<'2016-06-22'
  4. 的内容
  5. GROUP BY id
  6. HAVING)不需要

答案 1 :(得分:0)

您正在寻找where条款:

select id, sum(balance)
from payment
where month < '2016-06-22'
group by id;

我发现混乱很有趣。大多数人试图将having逻辑放在where子句中(where子句中不允许聚合函数)。从另一个方向看错误是非常罕见的。

另请注意,select distinct几乎从不适合聚合查询。