加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在postgresql中的`tablefunc`查询中包含空值?

发布时间:2020-12-13 15:54:23 所属栏目:百科 来源:网络整理
导读:我正在尝试使用 postgresql中的 crosstab函数来创建数据透视表.但是,我很难理解如何在查询中构建我的SQL.我的数据由四列组成,如下所示: 我使用以下代码创建此表: CREATE TABLE ct(id SERIAL,zone_id int,group_id int,area double precision);INSERT INTO
我正在尝试使用 postgresql中的 crosstab函数来创建数据透视表.但是,我很难理解如何在查询中构建我的SQL.我的数据由四列组成,如下所示:

我使用以下代码创建此表:

CREATE TABLE ct(id SERIAL,zone_id int,group_id int,area double precision);
INSERT INTO ct(zone_id,group_id,area) VALUES(1,2,6798.50754160784);
INSERT INTO ct(zone_id,3,10197.7613124118);
INSERT INTO ct(zone_id,area) VALUES(2,1,85708.8676744647);
INSERT INTO ct(zone_id,56006.5971338327);
INSERT INTO ct(zone_id,5584.33145616642);
INSERT INTO ct(zone_id,5,8611.99732832252);
INSERT INTO ct(zone_id,6,36103.5509183704);
INSERT INTO ct(zone_id,8,9801.14541428806);
INSERT INTO ct(zone_id,area) VALUES(5,45796.0020793546);

紧跟postgresql文档,我在交叉表查询中使用以下代码:

SELECT *
FROM crosstab(
  'select zone_id,area
   from ct
   ')
AS ct(row_name integer,g_1 double precision,g_2 double precision,g_3 double precision,g_4 double precision,g_5 double precision,g_6 double precision,g_7 double precision,g_8 double precision);

这导致下表不是我想要的那样:

例如,在第二行中,我想要以下值:

85708.8676744647,56006.5971338327,5584.33145616642,NULL,8611.99732832252,36103.5509183704,9801.14541428806

相反,价值观是:

85708.8676744647,9801.14541428806

但是,似乎忽略了空值,因此我的列名称g1到g8与原始组不对应.

解决方法

使用 crosstab() variant with two parameters

SELECT * FROM crosstab(
   'SELECT zone_id,area
    FROM   ct
    ORDER  BY 1,2','SELECT g FROM generate_series(1,8) g'  -- ! Provide values explicitly
   )
AS ct(
     row_name integer,g_1 float8,g_2 float8,g_3 float8,g_4 float8,g_5 float8,g_6 float8,g_7 float8,g_8 float8);

从而明确地声明哪个值在哪个输出列中.因此该函数知道填充NULL值的位置.在这种情况下,generate_series()派上用场提供8行数字1-8. VALUES表达式可以替代:

'VALUES (1),(2),(3),(4),(5),(6),(7),(8)'

另外,不要忘记第一个参数查询中的ORDER BY子句.

我提供了detailed explanation in this related answer.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读