从 SQL 到 SPL:涉及列不确定的行转列
Postgresql 数据库的查询结果返回 6 列,第 1 列是分组列,第 2 列是组内的 Value 列,第 3-6 列是组内的 Key 列,一条记录只有一个 Key 列有值,其他 Key 列为空,每条记录有值的 Key 的位置不确定。
Food |
Value |
Characteristics |
Color |
Location |
Date |
Fruit |
10 |
total count |
|||
Fruit |
3 |
apple |
|||
Fruit |
1 |
orange |
|||
Fruit |
4 |
banana |
|||
Fruit |
2 |
cherry |
|||
Fruit |
5 |
red |
|||
Fruit |
4 |
yellow |
|||
Fruit |
1 |
blue |
现在要保持分组列不变,将组内明细由行转列,非空的 Key 列的值转为新列名,Value 列的值转为新列值。
Food |
total count |
apple |
orange |
banana |
cherry |
red |
yellow |
blue |
Fruit |
10 |
3 |
1 |
4 |
2 |
5 |
4 |
1 |
SQL有两种办法实现行转列,一是通过pivot、crosstab等函数,二是对每个新列使用max group by语句,但这两种方法必须写出新的列名,也就是原表的字段值,数据变化时SQL也要跟着改,很不灵活。如果想一套代码适用任意数据,就要用存储过程或高级语言动态生成列名,再执行前面的SQL,结构复杂了许多。
SPL的行列转换函数可以不写字段值,一套代码适用任意数据。
A |
|
1 |
=postgresql.query("select * from tb where Food=?”,”Fruit”) |
2 |
=A1.pivot(Food;[#3,#4,#5,#6].ifn(),Value) |
A1:通过JDBC查询数据库。
A2:用pivot函数将这组记录由行转列。第1个参数是分组列,第2个参数是Key的列名,ifn函数取集合中第1个非空的成员。第3个参数是Value列。
英文版 https://c.scudata.com/article/1733272495462