SQL: Select 有条件的计数和百分比

SQL: Select count and percentage with conditions

我有两张桌子

用户

   id_user|INT
   company | varchar

日志

log_id|int
id_user|int

我需要return公司,每个公司的用户总数,以及拥有至少 3 个日志的用户的百分比

我可以运行这个查询来获取公司和计数

select company, count (*) as 'Count'
from user 
group by company

这是return这个

Apple| 7
Google| 6

但我无法弄清楚如何 return 一个额外的列来显示至少拥有 3 个日志的用户的百分比。例如, 如果有 2 位用户拥有超过 3 条来自 Apple 的日志,而来自 Google 的一位用户拥有超过 3 条日志,则答案将如下所示:

Apple| 7| 29% (because 2/7=~29%)
Google| 6| 17% (because 1/7=~17%)

我认为这需要使用 windows 函数或某种类型的相关子查询,但我在准确获取正确百分比方面遇到了问题。

如有任何帮助,我们将不胜感激。 (使用 SQL 服务器 2008)

我实际上能够在不使用 window 函数的情况下做到这一点,尽管可能有一个版本可以使用它们。首先,我汇总了 CTE 中每个用户的日志数量。然后,我将用户 table 加入其中,使用条件聚合来计算每家公司拥有 3 个或更多日志的用户数量。

WITH cte AS (
    SELECT id_user, COUNT(*) AS cnt
    FROM Log
    GROUP BY id_user
)

SELECT
    u.company,
    COUNT(DISTINCT u.id_user) AS total_users,
    100.0 * SUM(CASE WHEN c.cnt >= 3 THEN 1 ELSE 0 END) /
        COUNT(DISTINCT u.id_user) AS log_3_users
FROM [User] u
LEFT JOIN cte c
    ON u.id_user = c.id_user
GROUP BY
    u.company;

Demo

请注意,在演示中我只有一些虚拟数据,其中 3 个 Google 用户中有 1 个有 3 个或更多日志,2 个 Microsoft 员工中有 1 个有 3 个或更多日志。