Очистка временной шкалы, которую я пытаюсь создать в SQL - PullRequest
0 голосов
/ 04 мая 2018

Я написал запрос, который выглядит так:

    SELECT
id,
product_name,
CASE WHEN by_month = 'January 2018' THEN total_sales ELSE 0 END AS january_2018,
CASE WHEN by_month = 'February 2018' THEN total_sales ELSE 0 END AS february_2018,
CASE WHEN by_month = 'March 2018' THEN total_sales ELSE 0 END AS march_2018,
CASE WHEN by_month = 'April 2018' THEN total_sales ELSE 0 END AS april_2018
FROM (
SELECT
mnth,
id,
product_name,
CASE WHEN mnth = '2018-01-01' THEN 'January 2018' 
WHEN mnth = '2018-02-01' THEN 'February 2018' 
WHEN mnth = '2018-03-01' THEN 'March 2018' 
WHEN mnth = '2018-04-01' THEN 'April 2018' END AS by_month,
SUM(sales) total_sales
FROM (
SELECT
date_trunc('month', event_date) mnth,
id,
product_name,
SUM(sales) sales
FROM
table1
WHERE event_date BETWEEN '2017-01-01' AND '2018-04-30'
1,2,3)
WHERE sales > 0 
GROUP BY 
1,2,3,4)
GROUP BY 
1,2, by_month, total_sales

Но это дает очень фрагментированный результат, который выглядит следующим образом

id   product_name january_2018 february_2018 march_2018 april 2018
123  abc               500           0           0          0
123  abc               0             700         0          0
123  abc               0             0         900          0
123  abc               0             0           0         100

Я хотел бы исключить результаты «0» (я знаю, что это то, что я намеренно добавил в утверждение ELSE, но мне понадобился заполнитель.

Я бы хотел, чтобы результаты выглядели так.

id   product_name january_2018 february_2018 march_2018 april 2018
123  abc               500          700         900         100

Как это можно сделать? Это будет что-то в операторе ELSE или другой подзапрос? Или что-то еще?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Для более чистого агрегирования вы можете использовать предложение FILTER с такими агрегатными функциями, как это:

SELECT
  id,
  product_name,
  SUM(total_sales) FILTER (WHERE by_month = 'January 2018') AS january_2018,
  SUM(total_sales) FILTER (WHERE by_month = 'February 2018') AS february_2018,
  SUM(total_sales) FILTER (WHERE by_month = 'March 2018') AS march_2018,
  SUM(total_sales) FILTER (WHERE by_month = 'April 2018') AS april_2018
FROM
  table_name
GROUP BY
  id,
  product_name

Это стандартная функция SQL: 2003, но в настоящее время поддерживается только в PostgreSQL. Для получения дополнительной информации см. Предложение FILTER: выборочные агрегаты

0 голосов
/ 04 мая 2018

Использование агрегации:

SELECT id, product_name,
       SUM(CASE WHEN by_month = 'January 2018' THEN total_sales ELSE 0 END) AS january_2018,
       SUM(CASE WHEN by_month = 'February 2018' THEN total_sales ELSE 0 END) AS february_2018,
       SUM(CASE WHEN by_month = 'March 2018' THEN total_sales ELSE 0 END) AS march_2018,
       SUM(CASE WHEN by_month = 'April 2018' THEN total_sales ELSE 0 END) AS april_2018
FROM table_name
GROUP BY id, product_name
...