SQL:根据条件选择计数和百分比

时间:2018-04-29 02:01:05

标签: sql-server-2008 group-by count percentage correlated-subquery

我有两张桌子

用户

   id_user|INT
   company | varchar

日志

log_id|int
id_user|int

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

我可以运行此查询来获取公司并计算

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

返回此

Apple| 7
Google| 6

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

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

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

非常感谢任何帮助。 (使用SQL Server 2008)

1 个答案:

答案 0 :(得分:0)

我实际上可以在不使用窗口函数的情况下执行此操作,但可能有一个版本可以使用它们。首先,我汇总了CTE中每个用户的日志数。然后,我将用户表加入到此,使用条件聚合来计算每个公司有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;

enter image description here

Demo

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