Проблемы с использованием Rollup с ORDER BY - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть запрос:

SELECT IFnull(t.diapason,'total') as diapason, COUNT(distinct user_id) AS 
'number_of_users'
FROM (SELECT p.user_id, p.amount as total, CASE  
    when amount<=100 then '0-100' 
when amount>100 and amount<=150 then '100-150' 
when amount>150 then '>150 +' END AS diapason
    FROM 
        (SELECT payments.user_id, SUM(amount) AS amount 
       FROM payments INNER JOIN (SELECT DISTINCT user_id FROM activity where 
login_time between '2018-04-12' and '2018-04-18') a ON payments.user_id = 
a.user_id
             GROUP BY payments.user_id) p) t
GROUP BY diapason WITH ROLLUP
 ORDER BY number_of_users desc;

Если я сделаю этот запрос, я получу сообщение:

ERROR 1221 (HY000): Incorrect usage of CUBE/ROLLUP and ORDER BY

Но если я мужчина это без ORDER BY - это работает. Но мне нужны результаты по порядку.

Что мне делать?

Ответы [ 2 ]

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

Как я прокомментировал в вашем предыдущем вопросе по этой теме, есть более хороший способ сделать это, который включает в себя гораздо менее жесткое кодирование значений диапазона, предполагая, что большинство диапазонов распределены равномерно (то есть, порциями по 50, 100 и т. Д.)

+---------+--------+
| user_id | amount |
+---------+--------+
|       1 |    300 |
|       1 |    100 |
|       2 |    100 |
|       2 |    100 |
|       3 |     10 |
|       4 |    200 |
+---------+--------+
6 rows in set (0.00 sec)

select rng, obs
from
(
select 't' as src,
         case when amount < 100 then '0-99'
               when amount > 150 then '> 150'
         else
         concat(floor(amount/50) * 50 , '-' ,floor(amount/50) * 50  + 49) 
         end as rng,
         count(*) obs
from t
group by src,rng
) a
union       select  'Total' rng, count(*) from t
group by  rng;

Здесь вычисления с использованием пола определяют большую часть значений диапазона, простое объединение вычисляет общую сумму.

+---------+-----+
| rng     | obs |
+---------+-----+
| 0-99    |   1 |
| 100-149 |   3 |
| > 150   |   2 |
| Total   |   6 |
+---------+-----+
4 rows in set (0.01 sec)

Если вам нужно заполнить значения диапазона, которые не существуютв вашей таблице см. https://dba.stackexchange.com/questions/68791/group-by-in-ranges для предлагаемого подхода.

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

использовать подзапрос, сделать заказ на

  select t1.* from   
(
SELECT IFnull(t.diapason,'total') as diapason, COUNT(distinct user_id) AS 
    'number_of_users'
    FROM (SELECT p.user_id, p.amount as total, CASE  
        when amount<=100 then '0-100' 
    when amount>100 and amount<=150 then '100-150' 
    when amount>150 then '>150 +' END AS diapason
        FROM 
            (SELECT payments.user_id, SUM(amount) AS amount 
           FROM payments INNER JOIN (SELECT DISTINCT user_id FROM activity where 
    login_time between '2018-04-12' and '2018-04-18') a ON payments.user_id = 
    a.user_id
                 GROUP BY payments.user_id) p) t
    GROUP BY diapason WITH ROLLUP
) as t1 ORDER BY t1.number_of_users desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...