SQL-запрос с условиями и GROUP BY внутри CASE WHEN - PullRequest
0 голосов
/ 21 мая 2018

У меня есть две таблицы

пользователей:

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

сессий:

+------------+---------+
| 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, я думаю, он начинает считать сессии как пользователи

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Если вам нужен простой запрос, я бы предложил использовать CTE (с предложением), чтобы вы могли вычислить активных и общих пользователей отдельно, а затем объединить 2 части:

With 

 total_users as ( SELECT company, count(user_id) as tot_usr FROM users)

,active_users as (SELECT company, count(user_id) as act_usr FROM users where user_id in (select user_id from sessions))


SELECT 
 t.company
, t.tot_usr
, a.act_ust
FROM total_users T 
 left outer join active_users A on t.company = a.company
0 голосов
/ 21 мая 2018

Попробуйте:

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 содержит отдельный список пользователей).

Демоверсия здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...