首页 >数据库 >mysql教程 >如何使用'tablefunc”模块在 PostgreSQL 中创建交叉表查询?

如何使用'tablefunc”模块在 PostgreSQL 中创建交叉表查询?

DDD
DDD原创
2025-01-25 11:16:10468浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn