清理时间轴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。我不知道为什么会忘记这一点。