Postgres枢轴表与交叉表

时间:2017-05-16 07:37:58

标签: sql postgresql crosstab

我有一张像下一张桌子的桌子:

    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
);

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

1 个答案:

答案 0 :(得分:0)

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

  1. 首先查询日期或允许输入日期,然后在数据库客户端中生成查询。
  2. 将此包装在一个返回refcursor的存储过程中
  3. 包装存储过程,该存储过程返回行的JSON表示列表。
  4. 但无论如何,如果不在某处动态生成查询,您无法在查询中执行此操作。