Postgresql 使用postgres tablefunc交叉表()返回空的单个值

Postgresql 使用postgres tablefunc交叉表()返回空的单个值,postgresql,pivot-table,crosstab,Postgresql,Pivot Table,Crosstab,我正在尝试将空值合并到返回的列表中,以便: 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

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

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
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_results.lab_test = 1 
                OR lab_tests_results.lab_test = 2 
                OR lab_tests_results.lab_test = 3 
                OR lab_tests_results.lab_test = 4 
                OR lab_tests_results.lab_test = 5 
                OR lab_tests_results.lab_test = 50 )
            ORDER BY 1 DESC, 2
        $$,
        $$
                VALUES('Mash pH'),
                    ('Sparge pH'),
                    ('Final Lauter pH'),
                    ('Wort pH'),
                    ('Wort FAN'),
                    ('Original Gravity'),
                    ('Mash Temperature')
        $$
        )   AS final_result(batch_id VARCHAR,
                            ph_mash FLOAT, 
                            ph_sparge FLOAT, 
                            ph_final_lauter FLOAT, 
                            ph_wort FLOAT, 
                            FAN_wort FLOAT, 
                            original_gravity FLOAT, 
                            mash_temperature FLOAT)
将返回:

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
我也知道,我不是第一个提出这个问题的人,但我还没有找到一个适合这些情况的解决办法。例如,这个--每次都假定相同的批ID。我不想指定批ID,而是要指定所有可用的批ID

这就引出了我在那里找到的另一组解决方案,它们处理来自指定类别的空列表结果。但是,因为我只是拿已经存在的东西,所以这不是问题。导致问题的是空的单个值,并导致值向左移动的透视表

任何建议都将不胜感激

编辑:在克林的帮助下,事情解决了。需要注意的是,VALUES部分必须与实际的lab_tests.test_name值匹配,以便:

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
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_results.lab_test = 1 
                OR lab_tests_results.lab_test = 2 
                OR lab_tests_results.lab_test = 3 
                OR lab_tests_results.lab_test = 4 
                OR lab_tests_results.lab_test = 5 
                OR lab_tests_results.lab_test = 50 )
            ORDER BY 1 DESC, 2
        $$,
        $$
                VALUES('Mash pH'),
                    ('Sparge pH'),
                    ('Final Lauter pH'),
                    ('Wort pH'),
                    ('Wort FAN'),
                    ('Original Gravity'),
                    ('Mash Temperature')
        $$
        )   AS final_result(batch_id VARCHAR,
                            ph_mash FLOAT, 
                            ph_sparge FLOAT, 
                            ph_final_lauter FLOAT, 
                            ph_wort FLOAT, 
                            FAN_wort FLOAT, 
                            original_gravity FLOAT, 
                            mash_temperature FLOAT)
谢谢你的帮助

使用:

交叉表(文本源\ sql,文本类别\ 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);