带有交叉表的 Postgres 数据透视表

Posted

技术标签:

【中文标题】带有交叉表的 Postgres 数据透视表【英文标题】:Postgres pivot table with crosstab 【发布时间】:2017-05-16 07:37:58 【问题描述】:

我有一张类似下一张的桌子:

+------------+---------+---------+---------+
|    date    | value 1 | value 2 | value 3 |
+------------+---------+---------+---------+
| 01/01/2017 |     263 |       7 |     222 |
| 02/01/2017 |     275 |      -9 |     209 |
| 03/01/2017 |     331 |      -9 |     243 |
| .          |       . |       . |       . |
| .          |       . |       . |       . |
| .          |       . |       . |       . |
+------------+---------+---------+---------+

我想在 postgres 中创建另一个:

+---------+---------------+------------+------------+
|         |    01/01/2017 | 02/01/2017 | 03/01/2017 |
+---------+---------------+------------+------------+
| value 1 |           263 |        275 |        331 |
| value 2 |             7 |         -9 |         -9 |
| value 3 |           222 |        209 |        243 |
+---------+---------------+------------+------------+

但我的问题是我不知道我会有多少日期,所以我必须使用这样的东西:

SELECT * FROM crosstab(
  $$ SELECT value1, date  FROM myTable ORDER BY 1 $$,
  $$ SELECT m FROM generate_series((select min(date) from myTable) ,(select max(date) from myTable), '1 month'::interval) m $$
) AS (
  ".." date, ".." date, ".." date, ".." date
);

有人可以帮助我吗?谢谢。

【问题讨论】:

I dont know how many dates I will have, 所以,如果你有 1000 个日期,那么你期望结果中有 1000 列? 是的,但我永远不会有 1000 列,因为日期的最大数量为 12,一年中的每个月一个。在示例中,dateformat 将是 mm/dd/yyyy。 【参考方案1】:

您的基本问题是 PostgreSQL 需要知道列的样子才能规划查询。因此,您需要返回某种固定列结构。有多种方法可以做到这一点:

    先查询日期或允许输入日期,然后在 db 客户端中生成您的查询。 将此包装在一个返回引用器的存储过程中 包装在一个存储过程中,该过程返回行的 JSON 表示形式列表。

但无论哪种方式,如果不在某处动态生成查询,您都无法在查询中执行此操作。

【讨论】:

以上是关于带有交叉表的 Postgres 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

使用 PostgreSQL 创建数据透视表

使用 Laravel 数据透视表的多行和多列输入表单

带有排名的电子表格数据透视表

数据透视表和数据交叉表

带有计数和总和的 SQL Server 数据透视表

我的带有 1 个查询表和 3 个数据透视表的 Excel 文件在没有数据的情况下刷新时大小为 9MB