使用postgres tablefunc crosstab()返回空的单个值

时间:2018-06-19 19:35:54

标签: postgresql pivot-table crosstab

我正在尝试将空值合并到返回的列表中,例如:

if sender === optionA {

将返回:

batch_id   |test_name   |test_value
-----------------------------------
10         | pH         | 4.7
10         | Temp       | 154
11         | pH         | 4.8
11         | Temp       | 152
12         | pH         | 4.5
13         | Temp       | 155
14         | pH         | 4.9
14         | Temp       | 152
15         | Temp       | 149
16         | pH         | 4.7
16         | Temp       | 150

但是,它当前返回此值:

batch_id   | pH         |Temp 
---------------------------------------
10         |  4.7       |   154
11         |  4.8       |   152
12         |  4.5       |   <null>
13         |  <null>    |   155
14         |  4.9       |   152
15         |  <null>    |   149
16         |  4.7       |   150

这是先前问题的扩展- Can the categories in the postgres tablefunc crosstab() function be integers?-导致当前查询:

batch_id   | pH         |Temp 
---------------------------------------
10         |  4.7       |   154
11         |  4.8       |   152
12         |  4.5       |   <null>
13         |  155       |   <null>
14         |  4.9       |   152
15         |  149       |   <null>
16         |  4.7       |   150

我也知道我并不是第一个提出这个问题的人,但是我还没有找到适合这些情况的解决方案。例如,这个How to include null values in `tablefunc` query in postgresql?-每次都采用相同的批次ID。我不想指定批次ID,而是要指定所有可用的ID。

这引出了我在那里找到的另一组解决方案,它们解决了指定类别的空列表结果。但是,由于我只是拿走已有的东西,所以这不是问题。是空的 individual 值引起了问题,并导致数据透视表的值向左移动。

任何建议都非常感谢!

编辑:在克林(Klin)的帮助下,它得到了解决。需要注意的是,VALUES部分必须与您追求的实际lab_tests.test_name值匹配,例如:

SELECT *
 FROM crosstab('SELECT lab_tests_results.batch_id, lab_tests.test_name, lab_tests_results.test_result::FLOAT
                FROM lab_tests_results, lab_tests
                WHERE lab_tests.id=lab_tests_results.lab_test AND (lab_tests.test_name LIKE ''Test Name 1'' OR lab_tests.test_name LIKE ''Test Name 2'')
                ORDER BY 1,2'
            )   AS final_result(batch_id VARCHAR, test_name_1 FLOAT, test_name_2 FLOAT);

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

使用second form of the function

  

crosstab(文本source_sql,文本category_sql)-产生一个“数据透视表”,其中包含第二个查询指定的值列。

例如:

SELECT *
FROM crosstab(
    $$
        SELECT lab_tests_results.batch_id, lab_tests.test_name, lab_tests_results.test_result::FLOAT
        FROM lab_tests_results, lab_tests
        WHERE lab_tests.id=lab_tests_results.lab_test 
        AND (
            lab_tests.test_name LIKE 'Test Name 1' 
            OR lab_tests.test_name LIKE 'Test Name 2')
        ORDER BY 1,2
    $$,
    $$ 
        VALUES('pH'), ('Temp') 
    $$
) AS final_result(batch_id VARCHAR, "pH" FLOAT, "Temp" FLOAT);