Сумма по определенным сгруппированным строкам - PullRequest
0 голосов
/ 28 августа 2018

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

Это выглядит так: enter image description here

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

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 и далее.

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

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Упрощенная форма предложения Гордона:

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
0 голосов
/ 28 августа 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);
...