我在语法上有困难...
这是我的查询:
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_time的用户。
所以,我想我应该使用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
答案 0 :(得分:1)
我理解您的问题。在01.01.2018-12.01.2018期间,您有3个用户(user_id = 1,2,3)登录。在这些用户中,user_id 1进行了2次付款,总计250次,user_id 2进行了1次付款,共40次付款,user_id 3进行了0次付款,因此其总值为0。因此,在0-200
范围内有2个值,在{范围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
更新
要添加总数为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
的内容。
您也可以在MySQL中执行相同的操作(请参见此SQLFiddle),方法是将该查询包装为子查询,并在COALESCE
列上使用diapason
。在这种情况下,输出为:
diapason number_of_users
0-200 2
200 + 1
Total 3
答案 1 :(得分:0)
您添加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;