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