使用CASE和GROUP BY語句實現動態透視表的更有效率方法
相較於文中提供的查詢,使用tablefunc
擴充中的crosstab()
函數是一種更有效率的替代方案。
安裝:
首先,如果尚未安裝tablefunc
擴展,請安裝:
<code class="language-sql">CREATE EXTENSION tablefunc;</code>
基本的Crosstab解決方案:
針對此場景的簡單crosstab
解決方案:
<code class="language-sql">SELECT * FROM crosstab( 'SELECT bar, 1 AS cat, feh FROM tbl_org ORDER BY bar, feh') AS ct (bar text, val1 int, val2 int, val3 int);</code>
合成類別欄:
如果沒有實際的類別列,可以使用視窗函數建立合成類別列:
<code class="language-sql">SELECT * FROM crosstab( $$ SELECT bar, val, feh FROM ( SELECT *, 'val' || row_number() OVER (PARTITION BY bar ORDER BY feh) AS val FROM tbl_org ) x ORDER BY 1, 2 $$ , $$VALUES ('val1'), ('val2'), ('val3')$$ ) AS ct (bar text, val1 int, val2 int, val3 int);</code>
動態Crosstab?
雖然使用plpgsql創建完全動態的crosstab
具有挑戰性,因為動態回傳類型有限制。以下是一個更簡單的測試案例範例:
<code class="language-sql">SELECT * FROM crosstab('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2') AS ct (row_name text, val1 int, val2 int, val3 int);</code>
tablefunc模組:
tablefunc
模組提供了一個簡化的方法:
<code class="language-sql">SELECT * FROM crosstab1('SELECT row_name, attrib, val::text FROM tbl ORDER BY 1,2');</code>
以上是如何使用「crosstab()」在 PostgreSQL 中有效率地建立動態資料透視表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!