【问题标题】:Group by one column and sum the other按一列分组并对另一列求和
【发布时间】:2015-05-15 20:24:08
【问题描述】:

这是一个查询

SELECT * FROM user_state_logs WHERE user_state_logs.user_id = 1
AND created_at BETWEEN '2015-05-03 11:06:05' AND '2015-05-13 11:06:05'

返回这个

user_id   state   duration
1         call    10
1         call    20
1         wait    30
1         call    10
1         wait    20

我想退货

user_id   state   duration
1         call    40
1         wait    50

我已尝试添加GROUP BY user_state_logs.state

但我得到了这个错误

错误:列“user_state_logs.user_id”必须出现在 GROUP BY 子句或在聚合函数中使用

所以两个问题:

为什么会出现这个错误?

我怎样才能让查询以第二种格式返回数据?

【问题讨论】:

  • 实际上,为什么总等待时间是 20,而不是 50?
  • @Uriil 可能是正确的,如果他想获得总体通话时间和最短等待时间,这就是我在回答中使用的。不过还是等他的评论比较好
  • @urill 你的错字

标签: sql postgresql


【解决方案1】:

试着那样做:

SELECT user_state_logs.state, user_state_logs.user_id, sum(user_state_logs.duration)  as duration
FROM user_state_logs 
WHERE user_state_logs.user_id = 1
AND created_at BETWEEN '2015-05-03 11:06:05' AND '2015-05-13 11:06:05'
GROUP BY user_state_logs.state, user_state_logs.user_id

【讨论】:

    【解决方案2】:

    您应该按user_id 和state 分组:

    SELECT user_id, state, sum(duration)
    WHERE user_state_logs.user_id = 1
       AND created_at BETWEEN '2015-05-03 11:06:05' AND '2015-05-13 11:06:05'
    GROUP BY user_id, state
    

    【讨论】:

      【解决方案3】:

      你得到错误,因为当你使用 group by 语句时定义了选择列表。试试这个:

      SELECT user_id, state, duration FROM user_state_logs 
      WHERE user_state_logs.user_id = 1
      AND created_at BETWEEN '2015-05-03 11:06:05' AND '2015-05-13 11:06:05'
      GROUP BY user_id, state, duration
      

      或

      SELECT user_id, state, max(duration) FROM user_state_logs 
      WHERE user_state_logs.user_id = 1
      AND created_at BETWEEN '2015-05-03 11:06:05' AND '2015-05-13 11:06:05'
      GROUP BY user_id, state
      

      【讨论】:

        猜你喜欢
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多