oracle 和新版 Mysql 里有 pivot 实现行列转置,但实际处理数据时,会碰到一些更复杂的转置情况,pivot 也搞不定,比如: 想转置成: 这个难点在于事先不知道有多少种收入来源,而且每个人的收入来源种类各不相同。
oracle 和新版 Mysql 里有 pivot 实现行列转置,但实际处理数据时,会碰到一些更复杂的转置情况,pivot 也搞不定,比如:
想转置成:
这个难点在于事先不知道有多少种收入来源,而且每个人的收入来源种类各不相同。先得计算出种类个数,根据个数动态生成表结构,然后按照顺序填充每个人的多个收入数据。
sql 的计算过程不提倡分步,对集合操作支持的也不彻底,很难应付这种多步骤复杂计算。
如果用集算器的 SPL 语言来处理,就能轻松实现:
A | B | |
1 | =connect("db") | =A1.query("select * from Income") |
2 | =B1.group(Name) | =A2.max(~.len()) |
3 | =create(Name,${B2.("Source"+string(~)+",Income"+string(~)).concat@c()}) | |
4 | for A2 | =A4.Name|A4.conj([Source,Income]) |
5 | >A3.record(B4) |
A3 格子根据原始数据得到期望数据结构的空表;B4 格子得到每个人要填充入空表的数据。
如果不用复杂计算得到结果列,只是根据某个字段值动态生成列,直接用 pivot 函数就可以;具体的列都不用指定,根据字段值自动生成:
=connect(”mysqlDB”).query(“select * from t”).pivot(g1;g2,f)。
除了动态行列转置,还有双向转置、转置同时存在列间运算等复杂转置需求,这些计算用 SPL 都容易编写出来,参考《转置》。
集算器 SPL 是解决 SQL 难题的专业脚本语言,它语法简单,符合自然思维,是天然分步、层次清晰的面向过程计算语言。它采用与数据库无关的统一语法,编写的算法可在数据库间无缝迁移。它是桌面级计算工具,即装即用,配置简单,调试功能完善,可设置断点、单步执行,每步执行结果都可查看。请参阅SQL 解题手
当数据不在数据库里时,SPL 执行复杂计算仍然方便:
=file(“d:/t.csv”).import(;,",").pivot...
SPL能很方便地嵌入到JAVA应用,可参考《Java 如何调用 SPL 脚本》。
具体使用方法可参考 《如何使用集算器》。
--结束END--
本文标题: SQL 如何实现动态的行列转置
本文链接: https://www.lsjlt.com/news/6364.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-16
2024-05-16
2024-05-16
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0