首頁 > 資料庫 > mysql教程 > 如何使用「tablefunc」模組在 PostgreSQL 中建立交叉表查詢?

如何使用「tablefunc」模組在 PostgreSQL 中建立交叉表查詢?

DDD
發布: 2025-01-25 11:16:10
原創
468 人瀏覽過

PostgreSQL 交叉表查詢詳解及tablefunc模組應用

How to Create Crosstab Queries in PostgreSQL using the `tablefunc` module?

本文將詳細介紹如何在PostgreSQL中使用tablefunc模組建立交叉表查詢。

安裝tablefunc模組

首先,需要安裝tablefunc擴充:

<code class="language-sql">CREATE EXTENSION IF NOT EXISTS tablefunc;</code>
登入後複製

範例

測試表:

<code class="language-sql">CREATE TABLE tbl (
   section   text,
   status    text,
   ct        integer
);

INSERT INTO tbl VALUES 
  ('A', 'Active', 1), ('A', 'Inactive', 2),
  ('B', 'Active', 4), ('B', 'Inactive', 5),
  ('C', 'Inactive', 7);</code>
登入後複製

目標交叉表:

<code>Section | Active | Inactive
---------+--------+----------
A       |      1 |        2
B       |      4 |        5
C       |        |        7</code>
登入後複製

crosstab函數

單一參數形式 (受限):

<code class="language-sql">SELECT *
FROM   crosstab(
   'SELECT section, status, ct
    FROM   tbl
    ORDER  BY 1,2'  -- 必须为 "ORDER BY 1,2"
   ) AS ct ("Section" text, "Active" int, "Inactive" int);</code>
登入後複製

雙參數形式 (建議):

<code class="language-sql">SELECT *
FROM   crosstab(
   'SELECT section, status, ct
    FROM   tbl
    ORDER  BY 1,2'  -- 也可简化为 "ORDER BY 1"

  , $$VALUES ('Active'::text), ('Inactive')$$
   ) AS ct ("Section" text, "Active" int, "Inactive" int);</code>
登入後複製

多行輸入的影響

單一參數形式:

  • 從左到右填入可用值欄位。
  • 多餘值將被丟棄。
  • 較早的輸入行優先。

雙參數形式:

  • 將每個輸入值指派到其專用的欄位。
  • 覆蓋任何先前的賦值。
  • 較晚的輸入行優先。

進階範例

psql中的crosstabview

PostgreSQL 9.6 在psql中引入了此元命令:

<code class="language-sql">db=> SELECT section, status, ct FROM tbl \crosstabview</code>
登入後複製

以上是如何使用「tablefunc」模組在 PostgreSQL 中建立交叉表查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板