Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Pivot - Fatal编程技术网

Postgresql 为逐月变化创建数据透视表

Postgresql 为逐月变化创建数据透视表,postgresql,pivot,Postgresql,Pivot,我从查询中返回了这些记录 +---------+--------------+-----------+----------+ | Country | other fields | sales | date | +---------+--------------+-----------+----------+ | US | 1 | $100.00 | 01/01/21 | | CA | 1 | $100.00

我从查询中返回了这些记录

+---------+--------------+-----------+----------+
| Country | other fields |   sales   |   date   |
+---------+--------------+-----------+----------+
| US      | 1            |  $100.00  | 01/01/21 |
| CA      | 1            |  $100.00  | 01/01/21 |
| UK      | 1            |  $100.00  | 01/01/21 |
| FR      | 1            |  $100.00  | 01/01/21 |
| US      | 1            |  $200.00  | 01/02/21 |
| CA      | 1            |  $200.00  | 01/02/21 |
| UK      | 1            |  $200.00  | 01/02/21 |
| FR      | 1            |  $200.00  | 01/02/21 |
我想展示从一个月到前一个月的销售变化,如下所示:

| Country | 01/02/21     | 01/01/21  | Var%     |
| US      |  $200.00     |  $100.00  | 100%     |
| CA      |  $200.00     |  $100.00  | 100%     |
| FR      |  $200.00     |  $100.00  | 100%     |
+---------+--------------+-----------+----------+

如何处理Postgres查询?

如果您总是只比较两个月:

select country
    , sum(sales) filter (where date ='01/01/21')  month1
    , sum(sales) filter (where date ='01/02/21')  month2
    , ((sum(sales) filter (where date ='01/02/21') /sum(sales) filter (where date ='01/01/21')) - 1) * 100 var
from tablename
where date in ('01/01/21' , '01/02/21')
group by country
您还可以从tablefunc扩展中查看
交叉表
,该扩展与上面的查询基本相同

CREATE EXTENSION IF NOT EXISTS tablefunc;

select * ,("01/02/21" /"01/01/21") - 1) * 100 var 
from(
select * from crosstab ('select Country,date , sales from tablename')
as ct(country varchar(2),"01/01/21" money , "01/02/21" money)
) t
有关交叉表的更多信息,请参见

但是,如果您希望以行而不是列的形式显示日期,您可以轻松地将其概括为所有日期:

select * 
   , ((sales / LAG(sales,1,1) over (partition by country order by date)) -1)* 100  var
from 
country 

您能告诉我如何使用tablefunc中的crontab吗?@sparkle,请参阅更新的答案,我的意思是“交叉表”。在同一时间使用crontab时,我把他们弄糊涂了:DAny,我如何使日期动态化,而不是在查询中硬编码?因为,用这种方式,我必须首先检查是否有两个月的数据和数据提取结果。我可能只有一个月的数据,在这种情况下%var将为零。您必须使用动态sql