具有未知值的双列上的 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 年作为列,并将总金额作为值。
我的问题:
我不知道如何在同一个查询中对两列进行主透视,是否可能或者您是否必须执行两个步骤?
2020 年和 2019 年是动态的,一天一天地变化。列中的年份在每一行都相同。
所以基本上我需要将去年和年份中的年份保存在某个变量中并将其传递给交叉表查询。
到目前为止,我自己做到了,但我只设法调整了一年,而 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_year
和 year
的碰撞。
您仍然需要知道年份查询将 return 因为您必须定义记录,因为它是由交叉表编辑的 return。
您可以将其包装在 EXECUTE format()
中,使其更具动态性并处理一些字符串学问题。
提到了这个问题 here。
所以我在我的 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 年作为列,并将总金额作为值。
我的问题:
我不知道如何在同一个查询中对两列进行主透视,是否可能或者您是否必须执行两个步骤?
2020 年和 2019 年是动态的,一天一天地变化。列中的年份在每一行都相同。
所以基本上我需要将去年和年份中的年份保存在某个变量中并将其传递给交叉表查询。
到目前为止,我自己做到了,但我只设法调整了一年,而 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_year
和 year
的碰撞。
您仍然需要知道年份查询将 return 因为您必须定义记录,因为它是由交叉表编辑的 return。
您可以将其包装在 EXECUTE format()
中,使其更具动态性并处理一些字符串学问题。
提到了这个问题 here。