首頁 >資料庫 >mysql教程 >如何使用「crosstab()」在 PostgreSQL 中有效率地建立動態資料透視表?

如何使用「crosstab()」在 PostgreSQL 中有效率地建立動態資料透視表?

Linda Hamilton
Linda Hamilton原創
2025-01-20 22:51:09765瀏覽

How Can I Efficiently Create Dynamic Pivot Tables in PostgreSQL Using `crosstab()`?

使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn