我在PostgreSQL中有一个销售表,其中有两列:销售和日期。例如,使用以下数据:
Date Sales
2017-02-05 600
2017-03-01 800
2018-01-10 300
2018-02-02 500
2018-02-03 300
2018-03-01 800
我需要计算按月汇总的各年之间的销售差异。
结果应该是这样的:
Month sales_2017 sales_2018 variance
Jan null 300 300
Feb 600 800 200
Mar 800 800 0
要获得上面的结果应该是什么查询?
答案 0 :(得分:1)
SELECT
to_char(to_date(date_part::text, 'MM'), 'Mon') as month, -- 3
sales_2017,
sales_2018,
COALESCE(sales_2018, 0) - COALESCE(sales_2017, 0) as variance -- 4
FROM (
SELECT
date_part('month', sales_date), -- 1
SUM(sales) FILTER (WHERE date_part('year', sales_date) = 2017) as sales_2017, -- 2
SUM(sales) FILTER (WHERE date_part('year', sales_date) = 2018) as sales_2018
FROM
sales
GROUP BY 1 -- 1
)s
ORDER BY date_part
date_part
给出日期的月份号。这样就可以按月分组,而没有日期的年份SUM
具有特定过滤器的值(在这种情况下,过滤器是年份)。这允许仅汇总单个年份的值date
重新创建to_date
类型,然后使用to_char
设置其格式)。 'Mon'
格式器给出了三个字母的缩写。variance
。 COALESCE
将NULL值转换为数字0