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;
请注意,在演示中我只有一些虚拟数据,其中 3 个 Google 用户中有 1 个有 3 个或更多日志,2 个 Microsoft 员工中有 1 个有 3 个或更多日志。
我有两张桌子
用户
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;
请注意,在演示中我只有一些虚拟数据,其中 3 个 Google 用户中有 1 个有 3 个或更多日志,2 个 Microsoft 员工中有 1 个有 3 个或更多日志。