Сумма по определенным сгруппированным строкам

У меня есть набор данных, который показывает количество гостей и доход для каждой категории потребителей (потребитель, который посетил один раз, дважды, 3 раза, 4 раза, 5 раз и т. д.).

Это выглядит так: введите здесь описание изображения

Мой запрос, чтобы получить эту таблицу выше, был:

SELECT number_of_trans, COUNT(*) AS guest_count, SUM(amount) AS revenue FROM customer_counting GROUP BY number_of_trans ORDER BY number_of_trans

Теперь я хочу суммировать как guest_count, так и доход, и я хочу суммировать их для следующих категорий: 1,2,3,4,5-7 и 8+.

Так что на самом деле 1,2,3 и 4 останутся прежними, но я буду суммировать в строках 5–7 и строках, начиная с строки 8 и далее.

Как бы я это сделал? Таблица, которую я хочу, приведена ниже (не беспокойтесь о точности значений):

введите здесь описание изображения

Надеюсь, мой вопрос понят.


person javacash    schedule 28.08.2018    source источник


Ответы (2)


Более простая форма предложения Гордона:

SELECT 
  CASE WHEN number_of_trans < 5 THEN cast(number_of_trans as varchar)
    WHEN number_of_trans < 8 THEN '5-7'
    ELSE '8+' 
  END as freq_band, 
  COUNT(*) AS guest_count, 
  SUM(amount) AS revenue 
FROM customer_counting 
GROUP BY CASE WHEN number_of_trans < 5 THEN cast(number_of_trans as varchar)
    WHEN number_of_trans < 8 THEN '5-7'
    ELSE '8+' 
  END
ORDER BY freq_band
person Caius Jard    schedule 28.08.2018

Используйте case и подзапрос (или CTE):

SELECT (CASE WHEN number_of_trans < 5 THEN CAST(number_of_trans as varchar)
             WHEN number_of_trans < 8 THEN '5-7'
             ELSE '8+'
        END) as grp,
       SUM(guest_count) as guest_count, SUM(revenue) as revenue
FROM (SELECT number_of_trans, COUNT(*) AS guest_count, SUM(amount) AS revenue
      FROM customer_counting
      GROUP BY number_of_trans
     ) x
GROUP BY grp
ORDER BY MIN(number_of_trans);
person Gordon Linoff    schedule 28.08.2018
comment
разве вокруг 8+ не должно быть кавычек? - person javacash; 28.08.2018
comment
@javacash . . . Спасибо. - person Gordon Linoff; 29.08.2018
comment
Я думаю, что этот запрос можно было бы упростить, поместив случай when во внутреннюю группу by? - person Caius Jard; 29.08.2018