gpt4 book ai didi

mysql - 带条件的 SQL 查询和 CASE WHEN 中的 GROUP BY

转载 作者:行者123 更新时间:2023-11-29 07:32:45 26 4
gpt4 key购买 nike

我有两张 table

用户:

+------------+-----------+
| user_id | company |
+------------+-----------+
| 1 | Apple |
| 2 | Apple |
| 3 | Microsoft |
+------------+-----------+

session :

+------------+---------+
| session_id | user_id |
+------------+---------+
| 1 | 1 |
| 2 | 3 |
| 3 | 1 |
+------------+---------+

我想在一个查询中查询两个表并得到如下所示的输出:

+------------+--------------+--------------+
| company | totalUsers | activeUsers |
+------------+--------------+--------------+
| Apple | 2 | 1 |
| Microsoft | 1 | 1 |
+------------+--------------+--------------+

使用这样的查询:

SELECT users.company, COUNT(users.user_id) as totalUsers, 
COUNT(DISTINCT(CASE WHEN COUNT(sessions.session_id) > 0
then sessions.user_id end)) as activeUsers
FROM users
LEFT OUTER JOIN sessions ON users.user_id = sessions.user_id
GROUP BY users.company_name

查询抛出错误。我知道 activeUsers 计数是错误的,但不知道如何组织它。此外,通过添加 LEFT OUTER JOIN,我得到了 totalUsers 的错误结果,我认为它开始将 session 计为用户

有什么想法吗?

最佳答案

试试这个:

SELECT users.company, 
COUNT(users.user_id) as totalUsers,
COUNT(s.user_id) as activeUsers
FROM users
LEFT OUTER JOIN
(
SELECT DISTINCT user_id
FROM sessions
) AS s ON users.user_id = s.user_id
GROUP BY users.company

工作原理:

  • 如果 s.user_id 为空,则 sessions 表中没有此用户的条目,COUNT 将跳过此用户.
  • 如果 s.user_id 不为空,则 COUNT 将对该用户计数仅一次(因为派生表 s 包含一个不同的 用户列表)。

Demo here

关于mysql - 带条件的 SQL 查询和 CASE WHEN 中的 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50450936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com