如何在查询中添加一些限制?

sbdsn5lh  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(278)

我在语法上有困难。。。
我的问题是:

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;

但现在我只需要选择在“2018-01-01”和“2018-01-12”之间有activity.login\u时间的用户。
所以,我想我应该使用内部连接并设置时间段。但是怎么做?
我的table:

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\u时间?
2018年1月1日至2018年1月12日期间的产量

diapason     number_of_users
0-200          2
200+           1
uqjltbpv

uqjltbpv1#

你加上 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;
5cnsuln7

5cnsuln72#

我理解你的问题是这样的。在2018年1月1日至2018年1月12日期间,您有3个用户(user_id=1,2,3)登录。在这些用户中,用户id 1支付了2笔共250,用户id 2支付了1笔共40,用户id 3支付了0,因此他们的总金额为0。因此,范围内有2个值 0-200 ,1在范围内 200 + . 如果这是正确的理解,此查询将为您提供所需的结果:

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 ROLLUPGROUP 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),方法是将这个查询 Package 成子查询并使用 COALESCEdiapason 列。在这种情况下,输出为:

diapason    number_of_users
0-200       2
200 +       1
Total       3

相关问题