首页 >数据库 >mysql教程 >如何使用'crosstab()”在 PostgreSQL 中高效创建动态数据透视表?

如何使用'crosstab()”在 PostgreSQL 中高效创建动态数据透视表?

Linda Hamilton
Linda Hamilton原创
2025-01-20 22:51:09766浏览

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