Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算postgresql中按月份汇总的年间销售额差异_Postgresql - Fatal编程技术网

计算postgresql中按月份汇总的年间销售额差异

计算postgresql中按月份汇总的年间销售额差异,postgresql,Postgresql,我在PostgreSQL中有一个sales表,有两列:sales和date。例如,使用以下数据: 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

我在PostgreSQL中有一个sales表,有两列:sales和date。例如,使用以下数据:

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
要获得上述结果,查询应该是什么?

  • date\u部分
    给出日期的月份号。这允许按月份分组,而不使用日期的年份
  • 这是一个简单的透视函数:
    SUM
    使用特定筛选器(在本例中,筛选器为年份)计算值。这只允许聚合单个年份的值
  • 根据月号计算月名(使用
    to_date
    重新创建一个
    日期
    类型,然后使用
    to_char
    对其进行格式化)。
    “Mon”
    格式化程序给出了三个字母的缩写
  • 从前面计算的列中计算
    方差
    <代码>合并将空值转换为数字
    0

  • 非常感谢!这正是我需要的!
    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