sql server—sql计算十进制平均值而不是整数

mctunoxg  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(288)

这个问题在这里已经有答案了

在sql中舍入平均值时如何检索小数(5个答案)
11个月前关门了。
我有一张这样的table:
活动表:

+---------+------------+---------------+---------------+
| user_id | session_id | activity_date | activity_type |
+---------+------------+---------------+---------------+
| 1       | 1          | 2019-07-21    | open_session  |
| 1       | 1          | 2019-07-21    | scroll_down   |
| 1       | 1          | 2019-07-21    | end_session   |
| 2       | 4          | 2019-07-21    | open_session  |
| 2       | 4          | 2019-07-22    | send_message  |
| 2       | 4          | 2019-07-22    | end_session   |
| 3       | 2          | 2019-07-22    | open_session  |
| 3       | 2          | 2019-07-22    | send_message  |
| 3       | 2          | 2019-07-22    | end_session   |
| 3       | 5          | 2019-07-22    | open_session  |
| 3       | 5          | 2019-07-22    | scroll_down   |
| 3       | 5          | 2019-07-22    | end_session   |
| 4       | 3          | 2019-06-20    | open_session  |
| 4       | 3          | 2019-06-20    | end_session   |
+---------+------------+---------------+---------------+

我试图计算截至2019-07-28的30天内每个用户的平均会话数。我正在sql server中处理这个问题。
我的问题是

SELECT 
       ROUND(COUNT(DISTINCT(session_id))/COUNT(DISTINCT(user_id)) ,2 ) average_sessions_per_user
FROM Activity
WHERE activity_date >= DATEADD(day, -30, 2019-07-27)

输出返回1。正确的输出应为1.33。
我不明白为什么我的输出是1。如果我检查输出 COUNT(DISTINCT(session_id)) 以及 COUNT(DISTINCT(user_id)) 分别返回4和3,这是正确的。然而,一旦我像上面的查询那样划分了它们,它就不能正常工作了。

toiithl6

toiithl61#

你的问题是 COUNT 返回一个整数,所以除以2 COUNT 值是一个整数除法,它将返回一个整数。将乘法与1.0相加,使运算成为浮点运算,然后返回预期结果:

SELECT 
       ROUND(1.0*COUNT(DISTINCT(session_id))/COUNT(DISTINCT(user_id)) ,2 ) average_sessions_per_user
FROM Activity
WHERE activity_date >= DATEADD(day, -30, '2019-07-27')

sqlfiddle演示
还要注意你的约会对象在里面 DATEADD 需要用引号括起来(参见上面的查询和演示)。

相关问题