计算PostgreSQL中按月汇总的年之间的销售差异

时间:2019-01-14 10:19:30

标签: postgresql

我在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

要获得上面的结果应该是什么查询?

1 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

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
  1. date_part给出日期的月份号。这样就可以按月分组,而没有日期的年份
  2. 这是一个简单的枢轴函数:SUM具有特定过滤器的值(在这种情况下,过滤器是年份)。这允许仅汇总单个年份的值
  3. 根据月份编号计算月份名称(使用date重新创建to_date类型,然后使用to_char设置其格式)。 'Mon'格式器给出了三个字母的缩写。
  4. 从先前计算的列中计算varianceCOALESCE将NULL值转换为数字0

Postgres date functions