在SQL中计算百分比总计计数

时间:2020-06-01 21:46:18

标签: sql sql-server

我有一个名为AccessLog的SQL Server表,每次用户单击我的网站上的“登录”时都会插入该表。重要字段是UserIDBrowserNameDate。目的是了解最常使用哪些浏览器访问该网站。

这是一个示例数据集:

| UserID | BrowserName | Date  |
|--------|-------------|-------|
| 1      | Chrome      | 05/28 |
| 1      | Chrome      | 05/29 |
| 2      | Firefox     | 05/29 |
| 1      | Chrome      | 05/30 |
| 3      | Firefox     | 05/31 |

这是我使用的SQL代码(找到here):

SELECT BrowserName
    ,(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER ()) pct
    ,COUNT(*) ct
FROM AccessLog
GROUP BY BrowserName

这些是我通过该查询获得的结果:

| BrowserName | pct  | ct |
|-------------|------|----|
| Chrome      | 60.0 | 3  |
| Firefox     | 40.0 | 2  |

但这是我想要的结果:

| BrowserName | pct  | ct |
|-------------|------|----|
| Chrome      | 33.3 | 1  |
| Firefox     | 66.6 | 2  |

如何修改查询以对每个UserIDBrowserName分别计数一次,而不是人为地增加计数?

2 个答案:

答案 0 :(得分:1)

您可以通过创建cte来尝试以下操作。这是demo

with total_users as
(
    select
      BrowserName,
      count(distinct UserId) as total_users
    from myTable
    group by
      BrowserName
)    
select 
    BrowserName,
    round((total_users * 100.0)/sum(total_users) over (), 1) as pct,
    total_users as ct
from total_users

输出:

| browsername | pct   | ct  |
| ----------- | ----- | --- |
| Chrome      | 33.3  | 1   |
| Firefox     | 66.6  | 2   |

答案 1 :(得分:0)

您要使用count(distinct)。但这不可能作为窗口函数直接在SQL Server中实现。因此,请使用dense_rank()技巧:

SELECT BrowserName,
       (COUNT(DISTINCT UserId) * 100.0 /
        (DENSE_RANK() OVER (ORDER BY UserId ASC) +
         DENSE_RANK() OVER (ORDER BY UserId DESC)
        )
       ) as pct,
      COUNT(DISTINCT UserId) as ct
FROM AccessLog
GROUP BY BrowserName