Как выбрать значения по группам, используя select sum ()? - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно выбрать значения по группам (от 0 до 10, от 10 до 50, более 50).

user_id     amount
  1           20
  1           40
  2           5
  3           30
  3           1

Почему этот запрос не работает правильно?

select (select sum(amount)),
case 
when (select sum(amount))<10 then '0-10' 
when (select sum(amount))>=10 and (select sum(amount))<50 then '10-20' 
else '>50' end as total_amount, count(distinct user_id) 
from table
group by
case 
when (select sum(amount))<10 then '0-10' 
when (select sum(amount))>=10 and (select sum(amount))<50 then '10-20' 
else '>50' end as total_amount, count(distinct user_id);



 output
diapason number_of_users
0-10      1
10-50     1
>50       1

Дайте мне подсказку, плз

Ответы [ 4 ]

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

Ваш запрос имеет ряд проблем, но в первую очередь он не будет работать, потому что вам нужно сделать сумму по пользователю до сортировки по диапазонам. Попробуйте вместо этого:

SELECT CASE  
         WHEN amount BETWEEN  0 AND  9 THEN ' 0-10'
         WHEN amount BETWEEN 10 AND 50 THEN '10-50'
         ELSE '>50' END AS diapason,
       COUNT(*) AS number_of_users
FROM (SELECT SUM(amount) AS amount 
      FROM payments 
      GROUP BY user_id) p
GROUP BY diapason;

выход

diapason    number_of_users
0-10        1
10-50       1
>50         1
0 голосов
/ 05 сентября 2018

Вы можете попробовать это, записав подзапрос, получить SUM суммы по каждому user_id, затем выполнить CASE WHEN, вам не нужно select sum(amount) в CASE WHEN.

CREATE TABLE t(
   user_id int,
   amount int
);


 insert into t values(1,20);
 insert into t values(1,40);
 insert into t values(2,5);
 insert into t values(3,30);
 insert into t values(3,1);

Запрос 1 :

select 
    case 
        when t1.total<10 then '0-10' 
        when t1.total>=10 and t1.total<50 then '10-50' 
        else '>50' end as diapason, 
    count(distinct user_id) number_of_users
from (
  SELECT user_id,SUM(amount) total
  FROM table
  GROUP BY user_id
) t1
group by 
    case 
        when t1.total<10 then '0-10' 
        when t1.total>=10 and t1.total<50 then '10-50' 
    else '>50' end

Результаты

| diapason | number_of_users |
|----------|-----------------|
|     0-10 |               1 |
|    10-50 |               1 |
|      >50 |               1 |
0 голосов
/ 05 сентября 2018

Ваш синтаксис неверен:

select case 
    when amount<10 then '0-10' 
    when  samount>=10 and amount<50 then '10-20' 
    else '>50' end as total_amount, count(distinct user_id) 
    from table
    group by
    case 
    when amount<10 then '0-10' 
    when  samount>=10 and amount<50 then '10-20' 
    else '>50' end 
0 голосов
/ 05 сентября 2018

Попробуйте ниже способ

    select 
    sum(case when amount <10 then 1 else 0 end) as "0-10",
    sum(case when amount >=10 and amount <50 then 1 else 0 end) as "0-50" ,       sum(case when amount>50 then 1 else 0 end) as ">50"   
    from table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...