Как добавить несколько ограничений в запрос? - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблемы с синтаксисом ...

Это мой запрос:

SELECT t.diapason,
       Count(*) AS 'number_of_users'
FROM   (SELECT CASE
                 WHEN amount < 200 THEN '0-200'
                 WHEN amount >= 200 THEN '200 +'
               end AS diapason
        FROM   (SELECT Sum(amount) AS amount
                FROM   payments) p) t
GROUP  BY t.diapason
ORDER  BY number_of_users DESC;  

Но теперь мне нужно выбрать только пользователей, которые имели активность.login_time между '2018-01-01' и '2018-01-12 '.

Итак, я думаю, что я должен использовать INNER JOIN и установить период времени. Бу как?

Мои таблицы:

activity
user_id    login_time
1          01.01.2018
2          01.01.2018
3          03.01.2018
4          30.02.2018

payments
user_id    amount   payment_time
1          50       10.12.2017
1          200      09.12.2017
2          40        08.08.2017

что я должен изменить в своем запросе, чтобы добавить activity.login_time?

Выход за период 01.01.2018-12.01.2018

diapason     number_of_users
0-200          2
200+           1

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я понимаю ваш вопрос как этот. Вы имели 3 пользователей (user_id = 1,2,3) логин в период 01.01.2018-12.01.2018. Из этих пользователей user_id 1 совершил 2 платежа на общую сумму 250, user_id 2 осуществил 1 платеж из 40, а user_id 3 произвел 0 платежей, поэтому их общее количество равно 0. Следовательно, в диапазоне 0-200 есть 2 значения, а в диапазоне * 1 1002 *. Если это правильное понимание, этот запрос даст вам желаемые результаты:

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason;

Выход:

diapason    number_of_users
0-200       2
200 +       1

Демонстрация SQLFiddle

Обновление

Чтобы добавить еще одну строку с итогом number_of_users, просто добавьте WITH ROLLUP к предложению GROUP BY:

SELECT CASE  
         WHEN amount < 200 THEN '0-200'
         WHEN amount >= 200 THEN '200 +'
       END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT a.user_id, COALESCE(SUM(p.amount), 0) AS amount
      FROM activity a
      LEFT JOIN payments p ON p.user_id = a.user_id
      WHERE a.login_time BETWEEN '01.01.2018' AND '12.01.2018'
      GROUP BY a.user_id) p
GROUP BY diapason WITH ROLLUP

Выход:

diapason    number_of_users
0-200       2
200 +       1
(null)      3

В вашей среде приложения вы можете использовать тот факт, что значение diapason равно NULL, чтобы вывести что-то вроде Total.

Обновлен SQLFiddle

Вы также можете сделать то же самое в MySQL (см. SQLFiddle ), заключив этот запрос в подзапрос и используя COALESCE в столбце diapason. В этом случае вывод будет:

diapason    number_of_users
0-200       2
200 +       1
Total       3
0 голосов
/ 05 сентября 2018

Вы добавляете WHERE предложение к фильтру.

SELECT t.diapason,
       COUNT(*) AS 'number_of_users'
FROM (
    SELECT 
        CASE
            WHEN amount < 200 THEN '0-200'
            WHEN amount >= 200 THEN '200 +'
        END AS diapason
    FROM   (
        SELECT payments.user_id, SUM(amount) AS amount
        FROM   payments
        INNER JOIN activity ON payments.user_id = activity.user_idAND activity.login_time = payments.payment_time
        WHERE activity.login_time BETWEEN '2018-01-10' AND '2018-01-12'
        GROUP  BY payments.user_id
    ) p
) t
GROUP  BY t.diapason
ORDER  BY number_of_users DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...