如何在postgresql的`tablefunc`查询中包含空值?[英] How to include null values in `tablefunc` query in postgresql?

本文是小编为大家收集整理的关于如何在postgresql的`tablefunc`查询中包含空值?的处理方法,想解了如何在postgresql的`tablefunc`查询中包含空值?的问题怎么解决?如何在postgresql的`tablefunc`查询中包含空值?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试在 crosstab 函数中使用 postgresql 创建一个 pivot table.但是,我很难理解如何在查询中构造我的 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, group_id, area) VALUES(1,3,10197.7613124118);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,1,85708.8676744647);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,2,56006.5971338327);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,3,5584.33145616642);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,5,8611.99732832252);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,6,36103.5509183704);
INSERT INTO ct(zone_id, group_id, area) VALUES(2,8,9801.14541428806);
INSERT INTO ct(zone_id, group_id, area) VALUES(5,1,45796.0020793546);

并密切关注 postgresql 文档,我在 crosstab 查询中使用以下代码:

SELECT *
FROM crosstab(
  'select zone_id, group_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, NULL, 9801.14541428806

取而代之的是:

85708.8676744647, 56006.5971338327, 5584.33145616642, 8611.99732832252, 36103.5509183704, 9801.14541428806

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

推荐答案

使用 crosstab() 变体,带有两个参数:

SELECT * FROM crosstab(
   'SELECT zone_id, group_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 子句.

我在此相关答案中提供了详细说明.

本文地址:https://www.itbaoku.cn/post/1763920.html