Postgresql

如何在交叉表中動態設置列名?

  • November 9, 2021

我有一個包含鍵和值的表,我保存瞭如下所示的值

實際表結構

當我使用以下查詢時

select * from crosstab (
   'select rowname,colname,max(cellval) from table_to_pivot group by 1,2 order by 1,2',
   'select distinct colname from table_to_pivot order by 1'
 ) as newtable (rowname varchar,_col1 integer,_col2 integer,_col3 integer);

我得到了我想要的輸出,如下所示

在此處輸入圖像描述

但我不想定義列名

$$ _col1 integer,_col2 integer,_col3 integer $$在我的查詢中,我希望它是動態的。有沒有辦法做到這一點?

SQL 引擎必須在執行查詢之前確定查詢的所有輸出列的名稱和類型。

如果事先不知道輸出列,因此無法將其硬編碼到查詢中,則必須通過兩個單獨的步驟來解決問題:

  1. 使用另一個查詢生成交叉表查詢
  2. 執行交叉表查詢

或者必須更改問題以接受嵌入在 JSON 列中的結果json_object_agg(如Static and dynamic pivots中所示)。

在 stackoverflow 上有多個關於這個問題的答案,探索各種解決方法。CASE 和 GROUP BY 的動態替代方案提供了相當多的讀取和指向其他 Q/A 的指針。

引用自:https://dba.stackexchange.com/questions/302341