#sql #pivot #amazon-redshift
#sql #стержень #амазонка-красное смещение
Вопрос:
У меня есть таблица с именем «source_table».
| Date | Country | Subscribers | ---------------------------------------- | 2021-10-01 | USA | 5 | | 2021-10-12 | Canada | 10 | | 2021-10-23 | USA | 15 | -- | 2021-11-01 | USA | 10 | | 2021-11-05 | Canada | 20 |
Я хочу преобразовать это в широкий формат
| Country | Oct-21 | Nov-21 | Dec-21 | -------------------------------------- | USA | 53 | 68 | 12 | | Canada | 35 | 86 | 21 |
Я попробовал следующий код:
SELECT country, CASE WHEN date BETWEEN '2021-10-01' AND '2021-10-31' THEN SUM(subscribers) END AS "Oct-21", CASE WHEN date BETWEEN '2021-11-01' AND '2021-11-30' THEN SUM(subscribers) END AS "Nov-21", CASE WHEN date BETWEEN '2021-12-01' AND '2021-12-31' THEN SUM(subscribers) END AS "Dec-21" FROM source_table GROUP BY country
Но приведенный выше код выдает ошибку, в которой говорится
column "source_table.date" must appear in the GROUP BY clause or be used in an aggregate function
Я не уверен, зачем в GROUP BY нужен столбец «дата»; если я использую его в GROUP BY, у меня страна повторяется несколько раз, и это не желаемый результат. Название страны должно отображаться только один раз с суммированным количеством подписчиков за этот месяц, и в столбцах не должно быть нулей (в таблице source_table для каждой страны каждый день есть по крайней мере один подписчик).
Я что-то здесь упускаю? Пожалуйста, помогите. Я использую SQL в Redshift.
Ответ №1:
Вы хотите суммировать или подсчитать CASE
выражения, например
SELECT country, SUM(CASE WHEN date BETWEEN '2021-10-01' AND '2021-10-31' THEN subscribers ELSE 0 END) AS "Oct-21", SUM(CASE WHEN date BETWEEN '2021-11-01' AND '2021-11-30' THEN subscribers ELSE 0 END) AS "Nov-21", SUM(CASE WHEN date BETWEEN '2021-12-01' AND '2021-12-31' THEN subscribers ELSE 0 END) AS "Dec-21" FROM source_table GROUP BY country;
Комментарии:
1. Решенный. Спасибо.