我有一个PostgreSQL函数(或表),它给我以下输出:
Sl.no username Designation salary etc..
1 A XYZ 10000 ...
2 B RTS 50000 ...
3 C QWE 20000 ...
4 D HGD 34343 ...
现在我想要的输出如下:
Sl.no 1 2 3 4 ...
Username A B C D ...
Designation XYZ RTS QWE HGD ...
Salary 10000 50000 20000 34343 ...
如何做到这一点?
5条答案
按热度按时间scyqe7ek1#
引用:将列转换为行
hmae6n7t2#
根据表格中的答案:
每一行都会返回一个新列。对于这样的动态返回类型,几乎不可能通过对数据库的一次调用使其完全动态化。通过两个步骤演示解决方案:
1.生成查询
1.执行生成的查询
通常,这会受到表所能容纳的最大列数的限制。因此,对于超过1600行(或更少)的表,这不是一个选项。详细信息:
波茨格雷斯9.4 +
crosstab()
的动态解决方案尽你所能用第一个。胜过其他的。
使用
attnum
代替实际的列名。更简单更快。再次将结果连接到pg_attribute
,或者像9.3页的例子那样整合列名。生成以下格式的查询:
这使用了一系列的高级功能。只是解释得太多了。
unnest()
的简单解决方案现在,一个
unnest()
可以并行取消嵌套多个阵列。结果:
老SQLF
Postgres 9.3或更早版本
crosstab()
的动态解决方案可能被 Package 成一个只有一个参数的函数...
生成以下格式的查询:
产生所需的结果:
unnest()
的简单解决方案生成以下格式的查询:
同样的结果。
ttp71kqs3#
如果(像我一样)需要bash脚本中的这些信息,请注意psql有一个简单的命令行开关,告诉它将表列输出为行:
-x
选项是让psql将列输出为行的关键。xu3bshqb4#
我有一个比Erwin上面指出的方法更简单的方法,它对我来说适用于Postgres(我认为它应该适用于所有支持SQL标准的主要关系数据库)
您可以简单地使用UNION来代替交叉表:
当然,这取决于您要应用此方法的情况。考虑到您事先知道您需要哪些字段,您甚至可以在查询不同的表时使用此方法。即:
这是一种更易维护的方法,恕我直言。查看此页面以获取更多信息:https://www.postgresql.org/docs/current/typeconv-union-case.html
yjghlzjz5#
在普通SQL或PL/pgSQL中没有合适的方法来完成此操作。
最好在应用程序中执行此操作,该应用程序从DB获取数据。