具有未知值的双列上的 Postgres 交叉表

Postgres Crosstab on double columns with unknown value

所以我在我的 Postgres v.10 数据库中有一个这样的 table

CREATE TABLE t1(id integer primary key, ref integer,v_id integer,total numeric, year varchar, total_lastyear numeric,lastyear varchar ) ;
    INSERT INTO t1 VALUES
    
    (1,  2077,15,10000,2020,9000,2019),
    (2,  2000,13,190000,2020,189000,2019),
    (3,  2065,11,10000,2020,10000,2019),
    (4,  1999,14,2300,2020,9000,2019);

select * 从 t1 =

id  ref    v_id total   year    total_lastyear  lastyear
1   2077    15  10000   2020       9000          2019
2   2000    13  190000  2020       189000        2019
3   2065    11  10000   2020       10000         2019
4   1999    14  2300    2020       9000          2019

现在我想旋转这个 table 以便我将 2020 年和 2019 年作为列,并将总金额作为值。

我的问题:

  1. 我不知道如何在同一个查询中对两列进行主透视,是否可能或者您是否必须执行两个步骤?

  2. 2020 年和 2019 年是动态的,一天一天地变化。列中的年份在每一行都相同。

  3. 所以基本上我需要将去年和年份中的年份保存在某个变量中并将其传递给交叉表查询。

到目前为止,我自己做到了,但我只设法调整了一年,而 2019 年和 2020 年是硬编码的。 Demo

您可以使用 WITH 一次旋转一个。

WITH xd1 AS (
        SELECT * FROM crosstab('SELECT ref,v_id,year,total FROM t1 ORDER BY 1,3',
 'SELECT DISTINCT year FROM t1 ORDER BY 1') AS ct1(ref int,v_id int,"2020" int)
     ), xd2 AS (
        SELECT * FROM crosstab('SELECT ref,v_id,lastyear,total_lastyear FROM t1 ORDER BY 1,3',
 'SELECT DISTINCT lastyear FROM t1 ORDER BY 1') AS ct2(ref int,v_id int,"2019" int)
     )
SELECT xd1.ref,xd1.v_id,xd1."2020",xxx."2019"
FROM xd1
LEFT JOIN xd2 AS xxx ON xxx.ref = xd1.ref AND xxx.v_id = xd1.v_id;

这不会阻止 last_yearyear 的碰撞。 您仍然需要知道年份查询将 return 因为您必须定义记录,因为它是由交叉表编辑的 return。

您可以将其包装在 EXECUTE format() 中,使其更具动态性并处理一些字符串学问题。 提到了这个问题 here