【问题标题】:PostgreSQL: Getting sum of values of similar ids distinctlyPostgreSQL:清楚地获取相似ID的值的总和
【发布时间】:2016-04-28 00:25:03
【问题描述】:

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

     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 | 

问题是,我想要日期小于指定日期的不同 id 的余额总和,

我正在使用这个查询:

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 子句中,但是删除同样的会给出一个错误,即月份必须在聚合函数的任一 group by 中,我想要这个输出,

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

请帮忙..

【问题讨论】:

    标签: sql postgresql group-by distinct


    【解决方案1】:

    使用id的简单聚合:

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

    LiveDemo

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

    1. payement 表中获取行
    2. 只过滤那些满足month&lt;'2016-06-22'
    3. GROUP BY身份证
    4. (HAVING) 不需要

    【讨论】:

      【解决方案2】:

      您正在寻找where 子句:

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

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

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

      【讨论】:

      • 如果有另一个 id 为 0009hotmail 的条目...?
      • 所以 group by 是对所有单独的 id 进行分组,对吧...?
      • group bygroup by 子句中的每个键组合生成一行,摘要在select 中计算。
      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 2012-07-03
      • 2012-09-05
      • 2020-10-23
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多