SQL с красным смещением — от высокого/длинного до широкого формата

#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. Решенный. Спасибо.