SQL计算十进制平均值而不是int [duplicate]

问题描述 投票:-1回答:1

我有一个如下表:

活动表:

+---------+------------+---------------+---------------+
| 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年7月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,这是正确的。但是,一旦像上面的查询一样对它们进行划分,它就无法正常工作。

sql sql-server count average distinct
1个回答
2
投票
您的问题是COUNT返回一个整数,因此将两个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')

Demo on SQLFiddle

还请注意,您在DATEADD中的日期需要用引号引起来(请参见上面的查询和演示)。

© www.soinside.com 2019 - 2024. All rights reserved.