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