清理时间轴I';我正在尝试用SQL创建

清理时间轴I';我正在尝试用SQL创建,sql,postgresql,amazon-redshift,Sql,Postgresql,Amazon Redshift,我编写了一个如下所示的查询: 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 tot

我编写了一个如下所示的查询:

    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
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
但这会产生一个非常零碎的结果,看起来像这样

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
语句中还是在它上面的另一个子查询?还是其他什么?

使用聚合:

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

对于更干净的聚合,可以将FILTER子句与聚合函数一起使用,如下所示:

    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
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上受支持。有关更多信息,请参阅

Oh…duh。我不知道为什么会忘记这一点。